PTA - C语言暑假题集5

7-84 求整数序列中出现次数最多的数

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式:
输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。
输出格式:
在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

输入样例:
10 3 2 -1 5 3 4 3 0 3 2
输出样例:
3 4

// 方法一
// 使用嵌套for循环,找到出现次数最多的数字
#include <stdio.h>

int a[1009];
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    int max=0,ans=a[0];
    for(int i=0;i<n;i++){
        int cnt=0;
        for(int j=0;j<n;j++){
            if(a[i]==a[j]) cnt++;
        }
        if(cnt>max){
            ans=a[i];
            max=cnt;
        }
    }
    printf("%d %d",ans,max);
    return 0;
}
// 方法二
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;cin >> n;
    map<int,int> mp;
    vector<int> v(n); // 存数字
    for(int i=0;i<n;i++){
        cin >> v[i];
        mp[v[i]]++;
    }
    int num=v[0];
    int cnt=mp[v[0]];

    for(auto it=mp.begin();it != mp.end();it++){
        if(it->second > cnt){
            num=it->first;
            cnt=it->second;
        }
    }
    cout << num << ' ' << cnt ;
    return 0;
}

7-85 统计字符出现次数

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

输入格式:
输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:
在一行中输出给定字符在给定字符串中出现的次数。

输入样例:
programming is More fun!
m
输出样例:
2

#include <stdio.h>

int main(){
    char s[89],ch;
    gets(s);
    scanf("%c",&ch);
    int cnt=0,ans=0;
    while(s[cnt]!='\0'){
        if(s[cnt]==ch) ans++;
        cnt++;
    }
    printf("%d",ans);
    return 0;
}

7-86 古风排版

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

输入样例:
4
This is a test case
输出样例:

asa T
st ih
e tsi
 ce s
#include <stdio.h>
#include <string.h>
#include <math.h>

#define MAX_LENGTH 1001

// 每列N个相当于N行,有ceil(len/n)列,我们将输出样例逆时针旋转90°
// 此时的N行变成了N列,ceil(len/n)行
void printAncientStyle(int N, const char *str) {
    int length = strlen(str);
    int rows = ceil(length*1.0 / N);  // 计算总行数(列数)
    
    char matrix[MAX_LENGTH][N + 1];  // 处理每行的字符矩阵
    // 填充矩阵
    for (int i = 0; i < rows; i++) {
        strncpy(matrix[i], str + i * N, N);
        matrix[i][N] = '\0';  // 确保每行字符串的末尾为 '\0'
    }

    // 打印古风排版
    for (int col = 0; col < N; col++) {
        for (int row = rows - 1; row >= 0; row--) {
            if (matrix[row][col] != '\0')  // 仅打印有效字符
                printf("%c", matrix[row][col]);
            else
                printf(" ");  // 打印空格以对齐
        }
        printf("\n");
    }
}

int main(void) {
    int N;
    char str[MAX_LENGTH];

    scanf("%d\n", &N);  // 读取列数
    // fgets(str, sizeof(str), stdin);  // 读取字符串(包括空格)
    // // 去掉可能的换行符
    // str[strcspn(str, "\n")] = '\0';
    gets(str);
    printAncientStyle(N, str);

    return 0;
}

7-87 散步

小土豆在公园按一定的规律散步。为确定自己的位置,小土豆在地图上画出了坐标系,并规定自己的初始位置是 (x,y)=(0,0)点,向东 x 指标增加,向北 y 坐标增加,1米为1单位程度。
一开始小土豆面朝东方,第i个阶段会向前走t米,并向左转。请帮小土豆计算经过n个阶段小土豆在哪
图片
输入格式:
一行一个整数 n,代表小土豆行动的阶段数。
输出格式:
一行两个整数,代表小土豆最终位置的 x 坐标和 y坐标。

输入样例:
100
输出样例:
-50 -50

// 运行超时
#include <stdio.h>

// 右->上->左->下
int main(){
    long long int x=0,y=0;
    long long int n;scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        if(i%4==1) x+=i; // 右
        else if(i%4==2) y+=i; // 上
        else if(i%4==3) x-=i;// 左
        else if(i%4==0) y-=i; // 下
    }
    printf("%lld %lld",x,y);
    return 0;
}
// 优化
#include<stdio.h>

int main() {
    long long int n;
    scanf("%lld", &n);
    long long int x = 0, y = 0;
    
    if (n >= 4) {
        // 计算完整的四个方向的圈数
        long long int full_cycles = n / 4;
        
        // 每个完整圈的移动(画图)- 等同于 n%4==0
        x -= 2 * full_cycles; // 左
        y -= 2 * full_cycles; // 下
        
        // 处理剩余的步数
        int remainder = n % 4; // 
        if (remainder >= 1) x += 4 * full_cycles + 1; // 右
        if (remainder >= 2) y += 4 * full_cycles + 2; // 上
        if (remainder >= 3) x -= 4 * full_cycles + 3; // 左
        // if (remainder >= 4) y -= 4 * full_cycles + 4; // 下
    }
    else {
        // 处理小于4步的情况
        for (int i = 1; i < n; i++) {
            if (i == 1) x += i; // 右
            if (i == 2) y += i; // 上
            if (i == 3) x -= i; // 左
        }
    }
    
    printf("%lld %lld\n", x, y);
    return 0;
}

7-88 小鱼的航程

有一只小鱼,它上午游泳 150 公里,下午游泳 100 公里,晚上和周末都休息(实行双休日),假设从周x(1<=x<=7) 开始算起,请问这样过了 n 天以后,小鱼一共累计游泳了多少公里呢?

输入格式:
输入两个整数 x , n (表示从周 x 算起,经过 n 天,x 是 1~7之间的整数,$$ 是 0~1000 之间的整数)。
输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

输入样例:
在这里给出一组输入。例如:
3 10
输出样例:
在这里给出相应的输出。例如:
2000

#include <stdio.h>

int main(){
    int x,n;scanf("%d %d",&x,&n);
    int ans=0;
    for(int i=0;i<n;i++){
        if(x!=6 && x!=7) ans+=250;
        if(x==7) x=0;
        x++;
    }
    printf("%d",ans);
    return 0;
}

7-89 成绩进步

小 Y 立志于做一个不偏科、所有学科全面发展的学生,然而,他的英语成绩始终未能达到他的预期。因此,他下定决心要提升自己的英语水平。
为了达成这个目标,他精心制定了一系列英语学习计划:清晨,他专注于背诵英语单词;中午,他倾听英语广播以锻炼听力;晚上,他则通过阅读英文报纸来拓宽阅读视野。不仅如此,他还决定每周进行一次英语水平测试,以此检验自己的学习成果。
作为小 Y 的好朋友,你每次都耐心地为他批改英语水平测试试卷,并将试卷妥善保存。经过 n 次测试后,小 Y 对自己的进步充满了好奇,他想知道自己的测试成绩是否呈现出持续且严格的进步态势——即除了第一次测试外,每一次的成绩都严格高于前一次。因此,他恳请你回顾他的所有测试成绩,并给出确切的答案。

输入格式:
输入共两行,
第一行一个整数 n(<=10),表示测试次数。
第二行 n 个整数,第 i 个数 a[i](<=100)表示第 i 次测试的成绩。
输出格式:
一行,如果是严格进步的,输出”YES”,否则输出”NO”。

输入样例1:
3
100 100 100
输出样例1:
NO
输入样例2:
3
99 98 95
输出样例2:
NO
输入样例3:
4
63 79 89 99
输出样例3:
YES

# include <stdio.h>

int a[11];
int main(){
    int n;scanf("%d",&n);
    int cnt=0;
    while(n--){
        int s;scanf("%d",&s);
        a[cnt++]=s;
    }
    int flag=1;
    for(int i=1;i<cnt;i++) {
        if(a[i]<=a[i-1]) {
            flag=0;
            break;
        }
    }
    if(flag) printf("YES");
    else printf("NO");
    return 0;
}

7-90 计算长方形的周长和面积

输入长方形的长和宽,要求计算长方形的周长和面积。

输入格式:
在一行中给出两个整数。
输出格式:
第一行长方形的周长。
第二行长方形的面积。

输入样例:
在这里给出一组输入。例如:
6 8
输出样例:
在这里给出相应的输出。例如:
周长 = 28
面积 = 48

#include <stdio.h>

// 考虑数据类型的范围
int main(){
    long long x,y;
    long long c,s;scanf("%lld %lld",&x,&y);
    c=(x+y)*2;
    s=x*y;
    printf("周长 = %lld\n",c);
    printf("面积 = %lld",s);
    return 0;
}

7-91 求一元二次方程的根

利用公式x1 = (-b + sqrt(bb-4ac))/(2a), x2 = (-b - sqrt(bb-4ac))/(2a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0。

输入格式:
输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数。
输出格式:
输出一行,表示方程的解。
若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=…。
若b2 > 4 * a * c,则两个实根不等,则输出形式为:x1=…;x2 = …,其中x1>x2。
若b2 < 4 * a * c,则有两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i,即x1的虚部系数大于等于x2的虚部系数,实部为0时不可省略。实部 = -b / (2a), 虚部 = sqrt(4ac-bb) / (2*a)
所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。

输入样例1:
1 0 1
输出样例1:
x1=0.00000+1.00000i;x2=0.00000-1.00000i
输入样例2:
1.0 2.0 8.0
输出样2:
x1=-1.00000+2.64575i;x2=-1.00000-2.64575i

#include <stdio.h>
#include <math.h>

int main(){
    double a,b,c;scanf("%lf %lf %lf",&a,&b,&c);
    double delt=b*b-4*a*c;
    
    if(delt==0) {
        printf("x1=x2=%.5f;",-b/(2*a));
    }
    else if (delt>0) {
        printf("x1=%.5f;",(-b+sqrt(delt))/(2*a));
        printf("x2=%.5f",(-b-sqrt(delt))/(2*a));
    }
    else { // delt < 0
        double r,i;
        r=-b/(2*a);
        i=sqrt(-delt)/(2*a);
        printf("x1=%.5f+%.5fi;",r,i);
        printf("x2=%.5f-%.5fi",r,i);
    }

    return 0;
}

7-92 找相同字符

给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。
两个方案不同当且仅当这两个子串中有一个位置不同。

输入格式:
两行,两个字符串 s1,s2,长度分别为 n1,n2。
输出格式:
1≤n1,n2≤2×10^3,
字符串中只有小写字母。

输入样例:
aabb
bbaa
输出样例:
10

#include <stdio.h>
#include <string.h>

#define MAXN 2005

int dp[MAXN][MAXN];

int main() {
    char s1[MAXN], s2[MAXN];
    scanf("%s", s1);
    scanf("%s", s2);
    
    int n1 = strlen(s1);
    int n2 = strlen(s2);
    
    // 初始化dp数组
    // for (int i = 0; i <= n1; ++i) {
    //     for (int j = 0; j <= n2; ++j) {
    //         dp[i][j] = 0;
    //     }
    // }
    memset(dp,0,sizeof(dp));
    
    // 计算dp值
    long long ans = 0; // 使用 long long 来防止整数溢出
    for (int i = 1; i <= n1; ++i) {
        for (int j = 1; j <= n2; ++j) {
            if (s1[i-1] == s2[j-1]) {
                dp[i][j] = dp[i-1][j-1] + 1;
            }
            ans += dp[i][j];
        }
    }
    printf("%lld\n", ans);
    
    return 0;
}

7-93 连续整数相加

读入两个整数值 A 和 N,计算从 A 开始的 N 个连续整数的和。
注意,如果读入的 N 为 0 或负数,则继续读取数字直至读入 N 值为正整数为止。

输入格式:
共一行,包含整数 A 和若干个整数 N(不超过 100 个)。
输出格式:
一个整数,表示从 A 开始的 N 个连续整数的和。

数据范围
1≤A≤100,
−100≤N≤100

输入样例1:
3 2
输出样例1:
7
输入样例2:
3 -1 0 -2 2
输出样例2:
7

#include <stdio.h>

int main(){
    int a,n;scanf("%d",&a);
    // 如果n的值小于或等于0,那么继续读取下一个值。重复上述过程直到读取到一个大于0的值为止。
    while(scanf("%d",&n) && n<=0);
    int sum=0;
    while(n--){
        sum+=a++;
    }
    printf("%d",sum);
    return 0;
}

7-94 数组逆序

给你 n 个整数,将其逆序输出。

输入格式:
第一行一个整数 n (3<=n<=10) 代表数的个数。
第二行 n 个整数(空格隔开)(这些数在 0~10^6 之间)。
输出格式:
n 个整数(空格隔开)。

输入样例:
在这里给出一组输入。例如:
3
1 7 5
输出样例:
在这里给出相应的输出。例如:
5 7 1

#include <stdio.h>

int a[11];
int main(){
    int n;scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",&a[i]);
    for(int i=n-1;i>=0;i--){
        if(i==0) printf("%d",a[i]);
        else printf("%d ",a[i]);
    }
    return 0;
}

7-95 第n小的质数

输入一个正整数n,求第n小的质数。

输入格式:
一个不超过10000的正整数n。
输出格式:
第n小的质数。

数据范围
对于20%的数据 n<=500
对于50%的数据 n<=800
对于60%的数据 n<=1000
对于80%的数据 n<=5000
对于100%的数据 n<=10000

输入样例:
10
输出样例:
29

# include <stdio.h>

int isPrime(int x){
    if(x<=3) return 1;
    if(x%2==0 || x%3==0) return 0;
    for(int i=4;i*i<=x;i++){
        if(x%i==0) return 0;
    }
    return 1;
}
int arr[1000000]; // 素数数组要足够大, 对于100%的数据 n<=10000
int main(){
    int n;scanf("%d",&n);
    int cnt=0;
    for(int i=2;i<=1000000;i++){
        if(isPrime(i)) arr[cnt++]=i;
    }
    // for(int i=0;i<cnt;i++) printf("%d ",arr[i]);
    printf("%d",arr[n-1]);
    return 0;
}

7-96 连续非素数的最大长度

给出一个正整数 n ( 2<=n<=1000000 ),例如 n=30 ,在 1,2,3,……30 中,连续的非素数有:
4 长度为 1
6 长度为 1
8 9 10 长度为 3
12 长度为 1
14 15 16 长度为 3
18 长度为 1
20 21 22 长度为 3
24 25 26 27 28 长度为5
30 长度为 1
其中,最大长度为 5 ,即有连续的 5 个非素数。

输入格式:
一个整数 n 。
输出格式:
一个整数,即连续非素数最大长度。

数据范围
对于20%的数据 n<=100
对于30%的数据 n<=1000
对于50%的数据 n<=50000
对于60%的数据 n<=100000
对于80%的数据 n<=300000
对于100%的数据 n<=1000000

输入样例:
12
输出样例:
3

// 方法一
# include <stdio.h>

int isPrime(int x){
    if(x==1) return 0;
    for(int i=2;i*i<=x;i++){
        if(x%i==0) return 0;
    }
    return 1;
}
int arr[100000]; // 素数数组
int main(){
    int n;scanf("%d",&n);
    int cnt=0;
    for(int i=2;i<=n;i++){
        // if(isPrime(i)) arr[++cnt]=i;
        if(isPrime(i)) arr[cnt++]=i;
    }
    // for(int i=0;i<cnt;i++) printf("%d ",arr[i]);
    // // 后者-1再减去前者
    int max=0,len=0;
    // for(int i=1;i<=cnt;i++){
    for(int i=0;i<cnt;i++){
        len=arr[i]-1-arr[i-1];
        if(len>max) max=len;
    }
    printf("%d",max);
    return 0;
}
// 思路,计算2-n间的所有素数,然后用right-1-left,得到两素数间非素数的长度;
// 方法二
#include <stdio.h>

// 判断素数函数
int isPrime(int x) {
    if (x == 1) return 0; // 1不是素数
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return 0; // 如果能被整除,不是素数
    }
    return 1; // 是素数
}

int main() {
    int n;
    scanf("%d", &n);

    int max_len = 0, cur_len = 0;

    for (int i = 1; i <= n; i++) {
        if (!isPrime(i)) {
            cur_len++;
        } else {
            if (cur_len > max_len) {
                max_len = cur_len; // 更新最大长度
            }
            cur_len = 0; // 重置当前连续非素数的长度
        }
    }
    printf("%d\n", max_len);

    return 0;
}

7-97 螺旋加密

Chip和Dale发明了一种文本信息加密技术。他们事先秘密约定好矩阵的行数和列数。接着,将字符按如下方式编码:

  1. 所有文本只包含大写字母和空格。
  2. 每个字符均赋予一个数值:空格=0,A=1,B=2,……,Y=25,Z=26。
    按照下图所示的方式,将每个字符对应数值的5位二进制数依次填入矩阵。最后用0将矩阵补充完整。例如,对于信息“ACM”,行列数均为4时,矩阵将被填充为:
    图片将矩阵中的数字按行连起来形成数字串,完成加密。例子中的信息最终会被
    加密为:0000110100101100。

输入
一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。
输出
一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。

输入格式:
一行。首先是两个整数R(1≤R≤20)和C(1≤C≤20),表示行数和列数。之后是一个只包含大写字母和空格的字符串。字符串的长度≤(R*C)/5。R和C之间以及C和字符串之间均用单个空格隔开。
输出格式:
一行,为加密后的二进制串。注意你可能需要用0将矩阵补充完整。

数据范围
对于30%的数据 R,C<=10
对于100%的数据 R,C<=20

输入样例:
在这里给出一组输入。例如:
4 4 ACM
输出样例:
在这里给出相应的输出。例如:
0000110100101100

#include<bits/stdc++.h>  // 包含所有标准库的头文件,一般不推荐使用在实际的C++编程中,应当使用具体需要的头文件。
using namespace std;  // 使用标准命名空间

int r, c, b[500], m[30][30], num, k=1, r1, r2, c1, c2;  // 定义变量和数组

char a[100];  // 定义字符数组

int main() {
    cin >> r >> c;  // 输入行数和列数
    getchar();  // 读取换行符
    cin.getline(a, 100);  // 读取一行字符串

    int len = strlen(a);  // 获取字符串长度
    for (int i = 0; i < len; i++) {
        if (a[i] == ' ') {
            num = 0;  // 如果是空格,将num置为0
            // printf("%c\n",a[i]);
        } else {
            num = a[i] - 'A' + 1;  // 将字母转换成对应的数字,A对应1,B对应2,依次类推
            // printf("%c\n",a[i]);
        }
        for (int j = 1; j <= 5; j++) {
            b[(i + 1) * 5 + 1 - j] = num % 2;  // 将数字转换为5位二进制存入数组b
            // printf("%d\n",num%2);
            num /= 2;
            
        }  
    }
    // b[r*c]=0; // 注意你可能需要用0将矩阵补充完整。 b数组在静态区创建,默认全0
    // for(int i=1;i<=r*c;i++) printf("%d",b[i]);
    // printf("\n");
    r1 = 0; r2 = r - 1; c1 = 0; c2 = c - 1;  // 初始化矩阵边界

    // 将数组b 螺旋填充矩阵
    while (r1 <= r2 && c1 <= c2) {
        for (int j = c1; j <= c2; j++) m[r1][j] = b[k++];  // 从左到右填充上边界
        for (int i = r1 + 1; i <= r2; i++) m[i][c2] = b[k++];  // 从上到下填充右边界
        if (r1 != r2) for (int j = c2 - 1; j >= c1 ; j--) m[r2][j] = b[k++];  // 如果不是同一行,从右到左填充下边界
        if (c1 != c2) for (int i = r2 - 1; i >= r1 + 1; i--) m[i][c1] = b[k++];  // 如果不是同一列,从下到上填充左边界
        r1++; r2--; c1++; c2--;  // 缩小边界
    }

    // 输出填充好的矩阵
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            cout << m[i][j] ; // 输出矩阵中的每一个元素
        }
        // cout << endl;
    }
    
    return 0;  // 返回0,表示程序正常运行结束
}

7-98 小X数字母

小 X 喜欢研究字符串。
这天,小 X 随手在草稿纸上写下了一个大写字母字符串。此时,班长把成绩报告单发到了每位同学的手中。小 X 看到自己每门都是 A (优秀),非常高兴,灵光一闪想到一个问题: 在刚刚写下的字符串中,字母 A 最多连续出现了多少次呢?
小 X 立刻数了起来,但这个字符串实在是太长了,希望你帮帮他。

输入格式:
第一行一个字符串。(长度<=30)
输出格式:
第一行包含一个整数,表示该字符串中字母 A 最多连续出现的次数。

输入样例:
BAACA
输出样例:
2

#include <stdio.h>

int main(){
    char ch[39];
    scanf("%s",ch);
    int flag=0;
    // 1.整个字符串不存在A
    for(int i=0;ch[i]!='\0';i++){ // 遍历字符串
        if(ch[i]=='A') flag=1;
    }
    if(flag==0) {
        printf("%d",0);
        return 0;
    }
    // 寻找A连续出现的次数。
    int len=1,max=0;
    for(int i=0;ch[i]!='\0';i++){ // 遍历字符串
        if(ch[i]=='A'){
            if(ch[i+1]=='A') len+=1;
            else {
                if(len>max) max=len;
                len=1;
            }
        } 
    }
    printf("%d",max);
    return 0;
}

7-99 质数

一个大于 1 的自然数,如果除了 1 和它自身外,不能被其他自然数整除则称该数为质数。
例如 7 就是一个质数,因为它只能被 1 和 7 整除。
现在,给定你 N 个大于 1 的自然数,请你依次判断这些数是否是质数。

输入格式:
第一行包含整数 N,表示共有 N 个测试数据。
接下来 N 行,每行包含一个自然数 X。
输出格式:
每个测试用例输出一个结果,每个结果占一行。
如果测试数据是质数,则输出 X is prime,其中 X 是测试数据。
如果测试数据不是质数,则输出 X is not prime,其中 X 是测试数据。

数据范围
1≤N≤100,
1<X≤10^18

输入样例:
3
8
51
7
输出样例:
8 is not prime
51 is not prime
7 is prime

#include <stdio.h>
// 数据类型
// 2 3 5 7 9 11 13
int isPrime(long long int x){
    if(x<=1) return 0;
    // if(x<=3) return 1;
    // if(x%2==0 || x%3==0) return 0;
    for(long long int i=5;i*i<=x;i++){
        if(x%i==0) return 0;
    }
    return 1;
}
int main(){
    int n;scanf("%d",&n);
    while(n--){
        long long int x;scanf("%lld",&x);
        if(isPrime(x))
            printf("%lld is prime\n",x);
        else
            printf("%lld is not prime\n",x);
    }
    return 0;
}

7-100 打印星号三角形

打印星号三角形。

输入格式:
输入只有一行,包括 1 个整数 n(<=50) , n 代表行数
输出格式:
输出 n 行。

输入样例:
5
输出样例:

    *        *        *
   ***      ***      ***
  *****    *****    *****
 *******  *******  *******
***************************
#include <stdio.h>

int main(){
    int n;scanf("%d",&n);
    int cnt=0,start=1;
    for(int i=0;i<n;i++) {// 遍历行
        // 打印空格
        for(int j=0;j<n-1-i;j++) printf(" ");
        // 打印 *
        cnt=start;
        while(cnt--) printf("*");
        // 打印空格
        for(int j=0;j<n-1-i;j++) printf(" ");
        // 打印空格
        for(int j=0;j<n-1-i;j++) printf(" ");
        // 打印 *
        cnt=start;
        while(cnt--) printf("*");
        // 打印空格
        for(int j=0;j<n-1-i;j++) printf(" ");
        // 打印空格
        for(int j=0;j<n-1-i;j++) printf(" ");
        // 打印 *
        cnt=start;
        while(cnt--) printf("*");
        // 打印空格
        for(int j=0;j<n-1-i;j++) printf(" ");
        start+=2;
        printf("\n");
    }
    return 0;
}

7-101 简单函数

定义函数为:f(x)=x*2+1
要求编写程序,完成函数

输入格式:
一个数x
输出格式:
函数的值

输入样例:
4
输出样例:
9

#include <stdio.h>

int main(){
    long long int x; // 数据范围足够大!!!
    scanf("%lld",&x);
    long long int ans=x*2+1;
    printf("%lld",ans);
    return 0;
}

7-102 等差数列末项计算

给出一个等差数列的前两项a1,a2,求第n项是多少。

输入格式:
给出一个等差数列的前两项a1,a2,求第n项是多少。
输出格式:
一行,包含三个整数a1,a​2,n。

输入样例:
1 4 100
输出样例:
298

#include <stdio.h>

int main(){
    int a1,a2,n;scanf("%d %d %d",&a1,&a2,&n);
    int step=a2-a1;
    long long int ans=a1; // ans的范围要足够大!!!
    n-=1;
    while(n--){
        ans+=step;
    }
    printf("%lld",ans);
    return 0;
}

7-103 数独

已知下列44阶数独,要求将1,2,3,4这四个数填入空格,并使每行,每列和每宫都包含这四个数。
图片
输入格式:

输出格式:
输出4
4完整数独

输入样例:

输出样例:
2413
3124
1342
4231

# include <stdio.h>

int main(){
    int ans[4][4]={{2,4,1,3},
                   {3,1,2,4},
                   {1,3,4,2},
                   {4,2,3,1}};
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++) printf("%d",ans[i][j]);
        printf("\n");
    }
    return 0;
}

7-104 神奇的幻方

幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方

输入格式:
一个数字N(N<=35)
输出格式:
按上方法构造的N * N的幻方

输入样例:
3
输出样例:
8 1 6
3 5 7
4 9 2
解题思路:
第一个数字写在第一行的中间,
下一个数字,都写在上一个数字的右上方:
如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列;
如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行;
如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
在题目描述的基础上进行推倒,并时刻对row和col保持边界感,[0,n)之间

# include <stdio.h>

int ans[40][40];
int main()
{
    int n;scanf("%d",&n);
    ans[0][n/2]=1; // 第一个数字
    int row=0,col=n/2; // 所在位置
    for(int i=2;i<=n*n;i++){
        if(row==0 && ans[n-1][col+1]==0 && (col+1<n)){  // 在第一行
            row=n-1,col+=1;
            ans[row][col]=i;
            // printf(" %d\n",i);
            // printf("%d %d\n",row,col);
        }
        else if(col==n-1 && ans[row-1][0]==0 && row-1>=0){ // 在最后一列
            row-=1,col=0;
            ans[row][col]=i;
            // printf(" %d\n",i);
            // printf("%d %d\n",row,col);
        }
        else if((row==0 && col==n-1) || (ans[row-1][col+1]!=0 && row + 1>=0 && col+1<n)){ // 右上角或右上方有数字
            row+=1;
            ans[row][col]=i;
            // printf(" %d\n",i);
            // printf("%d %d\n",row,col);
        }
        else if(ans[row-1][col+1]==0 && row-1>=0 && col+1<n){ // 右上方没有数字
            row-=1,col+=1;
            ans[row][col]=i;
            // printf(" %d\n",i);
            // printf("%d %d\n",row,col);
        }
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++) {
            if(j==n-1) printf("%d",ans[i][j]);
            else printf("%d ",ans[i][j]);
        }
        printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值