PTA - C语言暑假题集5

目录

  • [7-84 求整数序列中出现次数最多的数](#7-84 求整数序列中出现次数最多的数)
  • [7-85 统计字符出现次数](#7-85 统计字符出现次数)
  • [7-86 古风排版](#7-86 古风排版)
  • [7-87 散步](#7-87 散步)
  • [7-88 小鱼的航程](#7-88 小鱼的航程)
  • [7-89 成绩进步](#7-89 成绩进步)
  • [7-90 计算长方形的周长和面积](#7-90 计算长方形的周长和面积)
  • [7-91 求一元二次方程的根](#7-91 求一元二次方程的根)
  • [7-92 找相同字符](#7-92 找相同字符)
  • [7-93 连续整数相加](#7-93 连续整数相加)
  • [7-94 数组逆序](#7-94 数组逆序)
  • [7-95 第n小的质数](#7-95 第n小的质数)
  • [7-96 连续非素数的最大长度](#7-96 连续非素数的最大长度)
  • [7-97 螺旋加密](#7-97 螺旋加密)
  • [7-98 小X数字母](#7-98 小X数字母)
  • [7-99 质数](#7-99 质数)
  • [7-100 打印星号三角形](#7-100 打印星号三角形)
  • [7-101 简单函数](#7-101 简单函数)
  • [7-102 等差数列末项计算](#7-102 等差数列末项计算)
  • [7-103 数独](#7-103 数独)
  • [7-104 神奇的幻方](#7-104 神奇的幻方)

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

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

输入格式:

输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式:

在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

输入样例:

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

3 4

c 复制代码
// 方法一
// 使用嵌套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;
}
c 复制代码
// 方法二
#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

c 复制代码
#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
c 复制代码
#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

c 复制代码
// 运行超时
#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;
}
c 复制代码
// 优化
#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

c 复制代码
#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

c 复制代码
# 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

c 复制代码
#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-4 ac))/(2 a), x2 = (-b - sqrt(bb-4 ac))/(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(4 ac-b b) / (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

c 复制代码
#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

c 复制代码
#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

c 复制代码
#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

c 复制代码
#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

c 复制代码
# 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

c 复制代码
// 方法一
# 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,得到两素数间非素数的长度;
c 复制代码
// 方法二
#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

c 复制代码
#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

c 复制代码
#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

c 复制代码
#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
输出样例:

    *        *        *
   ***      ***      ***
  *****    *****    *****
 *******  *******  *******
***************************
c 复制代码
#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

c 复制代码
#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

c 复制代码
#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

c 复制代码
# 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)之间

c 复制代码
# 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;
}
相关推荐
时光の尘5 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-15 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
IU宝2 小时前
C/C++内存管理
java·c语言·c++
qq_459730032 小时前
C 语言面向对象
c语言·开发语言
陌小呆^O^3 小时前
Cmakelist.txt之win-c-udp-client
c语言·开发语言·udp
qystca5 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
网易独家音乐人Mike Zhou11 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
搬砖的小码农_Sky13 小时前
C语言:数组
c语言·数据结构