机试day5

三角形的个数

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
/*变量约束:设三边为 a < b < c(严格递增,避免重复),满足:
周长:a + b + c = n;
三角形条件:a + b > c;
正整数:a ≥ 1,b ≥ a+1,c ≥ b+1。*/
int main(){
    int C;
    while(cin>>C){
        int count=0;
        for(int i=1;i<C;i++){
            for(int j=i+1;j<C;j++){
                int k=C-i-j;
                if(k>j&& (i+j)>k){
                    count++;
                }
            }
        }
        cout<<count<<endl;


        
    }


    return 0;
}

素数

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

bool if_sushu(int n){
     if (n < 2) return 0;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            return 0;
        }
    }
    return 1;
}


int find_sushu_num(int a,int b){
    int count=0;
    for(int i=a;i<=b;i++){
        if(if_sushu(i)){
            count++;
        }
    }
    return count;

}



int main(){
    int a,b;
    while(cin>>a>>b){
        cout<<find_sushu_num(a,b)<<endl;
 
    }
    return 0;
}

杨辉三角

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

void yanghui(int x){
    int num[100][100]={0};
    for(int i=0;i<x;i++){
            num[i][0]=1;
            num[i][i]=1;
        for(int j=1;j<i;j++){
            num[i][j]=num[i-1][j-1]+num[i-1][j];
        }
     
    }
    //输出
    for(int i=0;i<x;i++){
        for(int j=0;j<=i;j++){
           
            if(i==j){
                 cout<<num[i][j];
            }else{
                 cout<<num[i][j]<<" ";
            }
        }
        cout<<endl;
    }

}



int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        yanghui(x);
        cout<<endl;
    }

    return 0;
}

矩阵问题

cpp 复制代码
#include <stdio.h>
 
int main()
{
	int n;
	int i,j;
	while(scanf("%d",&n) != EOF)
	{
		int N=n*2+1;
		for(i=1;i<=N;i++)
			for(j=1;j<=N;j++)
			{
				if(i==j || i+j==N+1)
					printf("1"); 
				if(i>j && j<N+1-i)//
					printf("4"); 
				if(j<i && j>N+1-i)
					printf("3"); 
				if(i<j && i>N+1-j)
					printf("5"); 
				if(i<j && j<N+1-i)//
					printf("2"); 
 
				if(j<N)
					printf(" ");
				else
					printf("\n");
			}
	}
	return 0;
}

发牌

cpp 复制代码
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    // 1. 定义花色和玩家手牌(用二维字符数组存储,更简单)
    char color[4] = {'c', 'd', 'h', 's'}; // 梅花、方块、红桃、黑桃
    char player[4][13][5]; // 4个玩家,每人13张牌,每张牌最多5个字符(如"s 12")
    
    // 2. 初始化并发牌(核心逻辑简化)
    int card_idx = 0; // 牌的序号(0-51)
    for (int c = 0; c < 4; c++) { // 遍历4种花色
        for (int num = 0; num <= 12; num++) { // 遍历0-12的数字
            int p = card_idx % 4; // 分配给第p个玩家(0=1号,1=2号,2=3号,3=4号)
            // 把牌存入玩家手牌(如"c 0")
            sprintf(player[p][card_idx/4], "%c %d", color[c], num);
            card_idx++;
        }
    }
    
    // 3. 处理输入输出(极简写法)
    int n;
    while (cin >> n) {
        int p = n - 1; // 转成数组索引(1号→0,4号→3)
        // 输出13张牌,仅中间加空格
        for (int i = 0; i < 13; i++) {
            if (i > 0) cout << " ";
            cout << player[p][i];
        }
        cout << endl;
    }
    return 0;
}

数字金字塔

cpp 复制代码
#include <iostream>
#include <algorithm> // 用max函数
using namespace std;

int main() {
    int R;
    cin >> R;
    // 定义二维数组存储金字塔(R行,每行最多R列)
    int dp[100][100] = {0};
    
    // 1. 输入金字塔数据
    for (int i = 1; i <= R; i++) {
        for (int j = 1; j <= i; j++) {
            cin >> dp[i][j];
        }
    }
    
    // 2. 从倒数第二行向上递推(动态规划核心)
    for (int i = R - 1; i >= 1; i--) {
        for (int j = 1; j <= i; j++) {
            // 自身值 + 下一行正下方/右下方的较大值
            dp[i][j] += max(dp[i+1][j], dp[i+1][j+1]);
        }
    }
    
    // 3. 顶部的数值就是最大和
    cout << dp[1][1] << endl;
    
    return 0;
}

稀疏矩阵

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    int num[22][22]={0};
    while(cin>>a>>b){
        for(int i=1;i<=a;i++){
            for(int j=1;j<=b;j++){
                cin>>num[i][j];
            }
        }
    
    for(int i=1;i<=a;i++){
            for(int j=1;j<=b;j++){
                if(num[i][j]!=0){
                    cout<<i<<" "<<j<<" "<<num[i][j]<<endl;
                }
            }
        }
    cout<<endl;
    }


    return 0;
}

矩阵转换

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;


void reverse(int num[11][11],int a){
    int tmp=0;
    for(int i=1;i<=a;i++){
        for(int j=i;j<=a;j++){
            tmp=num[i][j];
            num[i][j]=num[j][i];
            num[j][i]=tmp;
           
            
        }
    }
    
}




int main(){
    int a;
    int num[11][11];

    //输入
    while(cin>>a){
        for(int i=1;i<=a;i++){
            for(int j=1;j<=a;j++){
                cin>>num[i][j];
            }
        }
    reverse(num,a);
    //输出
        for(int i=1;i<=a;i++){
            for(int j=1;j<=a;j++){
                if(j==a){
                cout<<num[i][j]<<endl;
                }else{
                cout<<num[i][j]<<" ";
                }
            }
        }
        cout<<endl;

        
    }
    
    return 0;
}

魔法阵

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int n; // 全局变量存储阶数

// 保留你的核心逻辑,仅补充递归终止、修正边界/冲突逻辑
void next_magic(int &flag, int hang, int lie, int mofang[20][20]){
    // 逻辑修正1:递归终止条件(填充完n²个数就停止,避免无限递归)
    if(flag >= n * n){
        return;
    }

    // 保留你的核心步骤:先算右上位置
    int old_hang = hang; // 保存原位置,冲突时用
    int old_lie = lie;
    hang = hang - 1;
    lie = lie + 1;
    flag++;
    
    // 逻辑修正2:行越界判断(<0才回绕,不是==0)
    if(hang < 0){
        hang = n - 1;
    }
    // 逻辑修正3:列越界判断(>=n才回绕,不是==n)
    if(lie == n){
        lie = 0;
    }

    // 逻辑修正4:位置有数时,回到原位置的正下方(列不变)
    if(mofang[hang][lie] != 0){
        hang = old_hang + 1; // 原行+1,不是当前hang+1
        lie = old_lie;       // 列保持不变
    }

    mofang[hang][lie] = flag;
    next_magic(flag, hang, lie, mofang); // 语法已修正(加分号)
}

void mofang(int input_n){
    n = input_n;
    int mofang_arr[20][20] = {0}; // 语法已修正(数组名+初始化)
    int flag = 1;
    mofang_arr[0][n/2] = 1; // 1放在第一行中间列
    next_magic(flag, 0, n/2, mofang_arr); // 语法已修正(传数组名)
    
    // 输出魔方阵(保留你的输出逻辑,仅微调空行规则)
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(j > 0) cout << " ";
            cout << mofang_arr[i][j];
        }
        cout << endl;
    }
    // 移除多余空行(避免多组输出时重复空行)
}

// 保留你的main函数,仅补充多组输出的空行规则(题目要求)
int main(){
    int n;
    int is_first = 1; // 标记是否是第一组用例
    while(cin >> n){
        if(!is_first){
            cout << endl; // 非第一组先输出空行
        }
        mofang(n);
        is_first = 0;
    }
    return 0;
}
相关推荐
8Qi82 小时前
LeetCode热题100--189
c语言·数据结构·c++·算法·leetcode
灰色小旋风2 小时前
力扣第八题C++ 字符串转换整数
c++·算法·leetcode
@––––––2 小时前
力扣hot100—系列9—图论
算法·leetcode·图论
想你依然心痛2 小时前
HarmonyOS 5.0 PC应用开发实战:构建跨设备协同的桌面生产力工具
华为·harmonyos
pp起床2 小时前
图论 | part01
算法·深度优先·图论
luckycoding2 小时前
3676. 碗子数组的数目
算法·游戏·深度优先
I_LPL2 小时前
day50 代码随想录算法训练营 图论专题3
java·算法·深度优先·图论·求职面试
Flying pigs~~2 小时前
我的leetcode hot100之行(持续更新)
数据结构·算法·leetcode
滴滴答滴答答2 小时前
机考刷题之 7 LeetCode 240 搜索二位矩阵Ⅱ
java·算法·leetcode