先自己看代码思考,不理解的地方可以截图私聊……
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 !”。
输入样例:
本题没有输入。
输出样例:
2018wo3 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= 61+2= 3 2+2= 4 3+2= 5 4+2= 6 5+2= 71+3= 4 2+3= 5 3+3= 6 4+3= 7 5+3= 81+4= 5 2+4= 6 3+4= 7 4+4= 8 5+4= 91+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 开始。
输入样例:
33 4 2
输出样例:
#11 4 7 10 13 16 19 22 25 2831 34 37 40 43 46 49 52 55 5861 63 65 67 69 71 73 75 77 79#22 5 8 11 14 17 20 23 26 2932 35 38 41 44 47 50 53 56 5962 64 66 68 70 72 74 76 78 8082 84 86 88 90 92 94 96 98 100#33 6 9 12 15 18 21 24 27 3033 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:
52/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
24/3 2/3
输出样例2:
2
输入样例3:
31/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)); } } } }