先自己看代码思考,不理解的地方可以截图私聊……
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));
}
}
}
}