Bootstrap

2024入门测参考答案(c语言版)

先自己看代码思考,不理解的地方可以截图私聊……

7-1 祝福祖国!

这是一个编程题模板。

2024年即将到来,作为一名大学生,为了表达在新的一年里,对祖国的祝福,请编写程序输出祝福语:在新的一年里,愿祖国更加强大,国民更加幸福!

输入格式:

此题无输入。

输出格式:

在新的一年里,愿祖国更加强大,国民更加幸福!

输入样例:

 

输出样例:

在新的一年里,愿祖国更加强大,国民更加幸福!

参考答案:

#include<stdio.h>
int main(){
    printf("在新的一年里,愿祖国更加强大,国民更加幸福!");
}

7-2 宇宙无敌大招呼

据说所有程序员学习的第一个程序都是在屏幕上输出一句“Hello World”,跟这个世界打个招呼。作为天梯赛中的程序员,你写的程序得高级一点,要能跟任意指定的星球打招呼。

输入格式:

输入在第一行给出一个星球的名字S,是一个由不超过7个英文字母组成的单词,以回车结束。

输出格式:

在一行中输出Hello S,跟输入的S星球打个招呼。

输入样例:

Mars

输出样例:

Hello Mars

 参考答案:

#include<stdio.h>
int main(){
    char name[10];
    gets(name);
    printf("Hello ");
    for (int i = 0; name[i] != '\0'; i++) {
        printf("%c", name[i]);
    }
}

 7-3 2018我们要赢

2018年天梯赛的注册邀请码是“2018wmyy”,意思就是“2018我们要赢”。本题就请你用汉语拼音输出这句话。

输入格式:

本题没有输入。

输出格式:

在第一行中输出:“2018”;第二行中输出:“wo3 men2 yao4 ying2 !”。

输入样例:

本题没有输入。

输出样例:

2018
wo3 men2 yao4 ying2 !

参考答案:

#include<stdio.h>
int main(){
    printf("2018\n");
    printf("wo3 men2 yao4 ying2 !");
}

7-4 重要的话说三遍

这道超级简单的题目没有任何输入。

你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。

注意每遍占一行,除了每行的回车不能有任何多余字符。

参考答案:

#include<stdio.h>
int main(){
    for (int i = 0; i < 3; i++) {
        printf("I'm gonna WIN!\n");
    }
}

7-5 计算天数

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62

参考答案:

#include<stdio.h>
int common_year[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int leap_year[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
int main(){
    int year,month,day;
    scanf("%d/%d/%d",&year,&month,&day);
    int ans = 0;
    if (year%400 == 0 || (year%4 == 0 && year%100 != 0)) {
        for (int i = 0; i < month; i++) {
            ans += leap_year[i];
        }
        ans += day;
    }else {
        for (int i = 0; i < month; i++) {
            ans += common_year[i];
        }
        ans += day;
    }
    printf("%d",ans);
}

7-6 输出上半张九九乘法表

请输出上半张九九乘法表,即下三角的半张。

1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 
       2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 
              3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 
                     ......
                                                 8*8=64 8*9=72 
                                                        9*9=81 

输入格式:

输出格式:

按下面的格式输出,每个乘法结果值占2位(默认右对齐),其他数值仅占1位,每对之间一个空格隔开,最后一个也有空格,即每行结束后都有一空格,如1×9=9后有一空格再回车到第二行。

注意:从第二行开始前面都有空格,提示每个乘法共占6位,一定要注意上下是对齐的。

1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 
       2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 
              3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 
                    ...... 
                                          7*7=49 7*8=56 7*9=63 
                                                 8*8=64 8*9=72 
                                                        9*9=81

输入样例:

输出样例:

1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 
       2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 
              3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 
                     4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 
                            5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 
                                   6*6=36 6*7=42 6*8=48 6*9=54 
                                          7*7=49 7*8=56 7*9=63 
                                                 8*8=64 8*9=72 
                                                        9*9=81 

参考答案:

#include<stdio.h>
int main(){
    for (int i = 1; i <= 9; i++) {
        int blank_num = (i-1)*7;
        for (int j = 0; j < blank_num; j++) {
            printf(" ");
        }
        for (int j = i; j <= 9; j++) {
            printf("%d*%d=%2d ",i,j,i*j);
        }
        printf("\n");
    }
}

7-7 加法口诀表

请编写程序,输出 n+n 的加法口诀表。

样例输入
5

样例输出
1+1= 2 2+1= 3 3+1= 4 4+1= 5 5+1= 6
1+2= 3 2+2= 4 3+2= 5 4+2= 6 5+2= 7
1+3= 4 2+3= 5 3+3= 6 4+3= 7 5+3= 8
1+4= 5 2+4= 6 3+4= 7 4+4= 8 5+4= 9
1+5= 6 2+5= 7 3+5= 8 4+5= 9 5+5=10

注:和的域宽2格(右对齐);两列之间空1格;行末没有空格。

参考答案:

#include<stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (j > 1) printf(" ");
            printf("%d+%d=%2d",j,i,j+i);
        }
        printf("\n");
    }
}

7-8 输出下三角队形,数值从大到小,逐渐增长

输出下三角队形,数值从大到小,逐渐增长

输入格式:

m

输出格式:

1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1

输入样例:

在这里给出一组输入。例如:

6

输出样例:

在这里给出相应的输出。例如:

1 
2 1 
3 2 1 
4 3 2 1 
5 4 3 2 1 
6 5 4 3 2 1 

参考答案:

#include<stdio.h>
int main() {
    int n;
    scanf("%d",&n);
    for (int i = 1; i <= n; i++) {
        for (int j = i; j >= 1; j--) {
            printf("%d ",j);
        }
        printf("\n");
    }
}

7-9 素数对猜想

让我们定义dn​为:dn​=pn+1​−pn​,其中pi​是第i个素数。显然有d1​=1,且对于n>1有dn​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4

参考答案:

#include<stdio.h>
#include <stdbool.h>
bool isPrime(int x) {
    bool flag = true;
    if (x == 1) flag = false;
    if (x == 2) flag = true;
    if (x > 2) {
        for (int i = 2; i <= sqrt(x); i++) {
            if (x%i == 0) {
                flag = false;
                break;
            }
        }
    }
    return flag;
}

int main(){
    int n;
    scanf("%d",&n);
    int prime[9999];
    int index = 0;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
        if (isPrime(i) == true) {
            prime[index] = i;
            index++;
        }
    }
    for (int i = 1; i < index; i++) {
        if (prime[i] - prime[i-1] == 2) {
            ans++;
        }
    }
    printf("%d",ans);
}

7-10 求n以内最大的k个素数以及它们的和

本题要求计算并输出不超过n的最大的k个素数以及它们的和。

输入格式:

输入在一行中给出n(10≤n≤10000)和k(1≤k≤10)的值。

输出格式:

在一行中按下列格式输出:

素数1+素数2+…+素数k=总和值

其中素数按递减顺序输出。若n以内不够k个素数,则按实际个数输出。

输入样例1:

1000 10

输出样例1:

997+991+983+977+971+967+953+947+941+937=9664

输入样例2:

12 6

输出样例2:

11+7+5+3+2=28

参考答案:

#include<stdio.h>
int isPrime(int x) {
    int flag = 1;
    if (x == 1) flag = 0;
    if (x == 2) flag = 1;
    if (x > 2) {
        for (int i = 2; i <= sqrt(x); i++) {
            if (x%i == 0) {
                flag = 0;
                break;
            }
        }
    }
    return flag;
}
int main(){
    int n, k;
    scanf("%d %d",&n, &k);
    int sum = 0;
    int flag = 1;
    while(n > 0 && k > 0) {
        if (isPrime(n) == 1) {
            if (flag == 0) printf("+");
            printf("%d",n);
            sum += n;
            flag = 0;
            k--;
        }
        n--;
    }
    printf("=%d",sum);
}

7-11 查找孪生素数

孪生素数是指间隔为2的两个相邻素数,因为它们之间的距离已经近得不能再近了,如同孪生兄弟一样,故将这一对素数称为孪生素数。
例如(3,5),(5,7),(11,13)等
输入2个正整数m和n 求两个数之间的所有孪生素数。

输入格式:

在一行中输入2个整数m和n 。

输出格式:

若该区间有:则输出形如(3,5)素数对,一行输出一对,在最后一行统计输出共有几对孪生素数
若区间没有:输出“没有找到”

输入样例1:

2 20

输出样例1:

(3,5)
(5,7)
(11,13)
(17,19)
共找到4对孪生素数

输入样例2:

18  25

输出样例2:

没有找到

参考答案:

#include<stdio.h>
#include <stdbool.h>
bool isPrime(int x) {
    bool flag = true;
    if (x == 1) flag = false;
    if (x == 2) flag = true;
    if (x > 2) {
        for (int i = 2; i <= sqrt(x); i++) {
            if (x%i == 0) {
                flag = false;
                break;
            }
        }
    }
    return flag;
}
int main(){
    int m,n;
    scanf("%d %d",&m, &n);
    if (m > n) {
        int temp = m;
        m = n;
        n = temp;
    }
    int prime[9999];
    int index = 0;
    int ans = 0;
    for (int i = m; i <= n; i++) {
        if (isPrime(i) == true) {
            prime[index] = i;
            index++;
        }
    }
    for (int i = 1; i < index; i++) {
        if (prime[i] - prime[i-1] == 2) {
            ans++;
            printf("(%d,%d)\n",prime[i-1],prime[i]);
        }
    }
    if (ans == 0) {
        printf("没有找到");
    }else{
        printf("共找到%d对孪生素数",ans);
    }
}

7-12 验证“哥德巴赫猜想”

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:

输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24 = 5 + 19

 参考答案:

#include<stdio.h>
#include <stdbool.h>
bool isPrime(int x) {
    bool flag = true;
    if (x == 1) flag = false;
    if (x == 2) flag = true;
    if (x > 2) {
        for (int i = 2; i <= sqrt(x); i++) {
            if (x%i == 0) {
                flag = false;
                break;
            }
        }
    }
    return flag;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i = 2; i <= n; i++) {
        if (isPrime(i) == true && isPrime(n-i) == true) {
            printf("%d = %d + %d",n,i,n-i);
            break;
        }
    }
}
  

7-13 天梯赛座位分配

天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策略:假设某赛场有 N 所学校参赛,第 i 所学校有 M[i] 支队伍,每队 10 位参赛选手。令每校选手排成一列纵队,第 i+1 队的选手排在第 i 队选手之后。从第 1 所学校开始,各校的第 1 位队员顺次入座,然后是各校的第 2 位队员…… 以此类推。如果最后只剩下 1 所学校的队伍还没有分配座位,则需要安排他们的队员隔位就坐。本题就要求你编写程序,自动为各校生成队员的座位号,从 1 开始编号。

输入格式:

输入在一行中给出参赛的高校数 N (不超过100的正整数);第二行给出 N 个不超过10的正整数,其中第 i 个数对应第 i 所高校的参赛队伍数,数字间以空格分隔。

输出格式:

从第 1 所高校的第 1 支队伍开始,顺次输出队员的座位号。每队占一行,座位号间以 1 个空格分隔,行首尾不得有多余空格。另外,每所高校的第一行按“#X”输出该校的编号X,从 1 开始。

输入样例:

3
3 4 2

输出样例:

#1
1 4 7 10 13 16 19 22 25 28
31 34 37 40 43 46 49 52 55 58
61 63 65 67 69 71 73 75 77 79
#2
2 5 8 11 14 17 20 23 26 29
32 35 38 41 44 47 50 53 56 59
62 64 66 68 70 72 74 76 78 80
82 84 86 88 90 92 94 96 98 100
#3
3 6 9 12 15 18 21 24 27 30
33 36 39 42 45 48 51 54 57 60

参考答案:

#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int num[120] = {0};
    int max = 0;
    int id = 0;
    int pos[120][15][15] = {0};
    int pre = 0;
 
    //输入各高校队伍数并求出最大的队伍数
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &num[i]);
        max = num[i] > max ? num[i] : max;
    }
 
    //编号
    for (int j = 1; j <= max; j++)
    {
        for (int k = 1; k <= 10; k++)
        {
            for (int i = 1; i <= n; i++)
            {
                if (j <= num[i])
                {
                    //同一个学校隔位坐
                    if (pre == i)
                    {
                        id += 2;
                    }
                    else
                    {
                        //不同学校正常坐
                        id += 1;
                    }
                    pre = i;
                    pos[i][j][k] = id;
                }
            }
        }
    }
 
    //打印编号信息
    for (int i = 1; i <= n; i++)
    {
        printf("#%d\n", i);
        for (int j = 1; j <= num[i]; j++){
            for (int k = 1; k <= 10; k++){
                if (k > 1){
                    printf(" ");
                }
                printf("%d", pos[i][j][k]);
             }
             printf("\n");
        }
    }
    return 0;
}

7-14 打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:

19 *

输出样例:

*****
 ***
  *
 ***
*****
2

参考答案: 

#include<stdio.h>
#include<math.h>
int main(){
    int n;
    char c;
    scanf("%d %c",&n,&c);
    
    int m=sqrt((n+1)/2);
    for(int i = 1;i <= m; i++){
        for(int j = 0; j < i-1; j++){
            printf(" ");
        }
        for(int j = 1; j <= 2*m-2*i+1; j++){
            printf("%c",c);
        }
        printf("\n");
    }
    
    for(int i = 1; i <= m-1; i++){
        for(int j = 1; j <= m-i-1; j++){
            printf(" ");
        }
        for(int j = 1; j <= 2*(i+1)-1; j++){
            printf("%c",c);
        }
        printf("\n");
    }
    
    printf("%d",n-2*m*m+1);
}

7-15 币值转换

输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:

输入在一行中给出一个不超过9位的非负整数。

输出格式:

在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1:

813227345

输出样例1:

iYbQdBcScWhQdBeSf

输入样例2:

6900

输出样例2:

gQjB

 参考答案:

#include<stdio.h>
int main()
{
    char rate[10] = {'0','0','S','B','Q','W','S','B','Q','Y'};
    char flag[10] = {'a','b','c','d','e','f','g','h','i','j'};
    char num[10];
    int n;
    scanf("%d",&n);
    
    if(n == 0){
        printf("a");
        return 0;
    }

    int i = 0;
    while(n != 0){
        num[i+1] = n % 10;
        n /= 10;
        i++;
    }
    
    for(i ; i > 0 ; i--){
        if(num[i] == 0 &&num[i-1] == 0){
            if(i == 5){
                printf("%c",rate[i]);
            }
            continue;
        }
        printf("%c",flag[num[i]]);
        if(i != 1 && num[i] != 0){
        printf("%c",rate[i]);
        }
    }
    return 0;
}

7-16 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

参考答案: 

#include<stdio.h>
typedef long long ll;
int n;
ll zi[110];
ll mu[110];
//求最大公因数,用于化简
ll gcd(ll a,ll b) {
    return a%b == 0 ? b : gcd(b, a%b);
}
int main()
{
    scanf("%d",&n);
    for (int i = 1; i <= n; i++) {
        scanf("%lld/%lld",&zi[i],&mu[i]);
    }
    //只有一个分数直接输出
    if (n == 1) {
        printf("%lld/%lld\n",zi[1]/(gcd(zi[1],mu[1])),mu[1]/(gcd(zi[1],mu[1])));
    }else {
        ll a = zi[1];
        ll b = mu[1];
        for (int i = 2; i <= n; i++) {
            a = a*mu[i] + zi[i]*b;
            b *= mu[i];
            int temp_a = a/gcd(a,b);
            int temp_b = b/gcd(a,b);
            a = temp_a;
            b = temp_b;
        }
        if (a%b == 0) {
            printf("%lld",a/b);
        }else {
            //处理真分数
            if (a < b) {
                printf("%lld/%lld",a/gcd(a,b),b/gcd(a,b));
            }
            //处理假分数
            else {
                printf("%lld %lld/%lld",a/b, (a%b)/gcd(a%b,b), b/gcd(a%b,b));
            }
            
        }
    }
    
}

;