- 输出“Hello World”(mooc第一周编程练习)
# 定义main函数,如果定义为 int型的函数,记得要有返回值0,如果定义为void则不需要返回值。
tip1:关于int main() 和 void main()
// 输出“Hello World” #include<stdio.h> int main(){ printf("Hello World"); return 0; }
- 逆序的三位数(5分)(mooc第二周编程练习)
题目内容:
逆序的三位数:
程序每次读入一个正三位数,然后输出逆序的数字。注意,当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
提示:用%10可以得到个位数,用/100可以得到百位数...。将这样得到的三个数字合起来:百位*100+十位*10+个位,就得到了结果。
注意:除了题目要求的输出,不能输出任何其他内容,比如输入时的提示,输出时的说明等等都不能。这道题目要求输出逆序的数字,程序就只能输出这个数字,除此之外任何内容都不能输出。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出逆序的数。
输入样例:
123
输出样例:
321
// 逆序三位数 #include <stdio.h> int main(){ int num, ones, tens, hundreds; scanf("%d", &num); ones = num%10; tens = (num-ones)%100/10; hundreds = (num-ones-tens)/100; printf("%d",ones*100+tens*10+hundreds); return 0; }
#逆序三位数利用数组方法解答
// 逆序三位数(数组) // %s和%d输出结果相同? #include<stdio.h> int main(){ char a[3]; scanf("%s", a); for (int i=strlen(a)-1;i>=0;i--){ printf("%c", a[i]); } return 0; }
- 时间换算(5分) (mooc第三周编程练习)
题目内容:
UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。现在,你的程序要读入一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
有效的输入范围是0到2359,即你的程序不可能从测试服务器读到0到2359以外的输入数据。
你的程序要输出这个时间对应的UTC时间,输出的格式和输入的相同,即输出一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。
提醒:要小心跨日的换算。
输入格式:
一个整数,表示BJT的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。
输出格式:
一个整数,表示UTC的时和分。整数的个位和十位表示分,百位和千位表示小时。如果小时小于10,则没有千位部分;如果小时是0,则没有百位部分;如果小时不是0而分小于10分,需要保留十位上的0;如果小时是0而分小于10分的,则不需要保留十位上的0。
输入样例:
803
输出样例:
3
// 题目没有说明是否有1190这样的输入,故加入了一个if判别式,来剔除错误输入 // 时间换算 #include<stdio.h> int main(){ int BJT, temp; scanf("%d", &BJT); if (BJT%100>59){ temp = BJT%100; temp -=60; BJT = (BJT/100+1)*100 + temp; } BJT -= 800; if (BJT<0) BJT += 2400; printf("%d", BJT); return 0; }
- 分队列(5分)(mooc第三周编程练习)
题目内容:
班级第一次列队,通常老师会让同学按身高排成一列,然后1、2报数,喊到1的同学向前一 步,就这样,队伍就变成两列了。假设现在一个班级有n个同学,并且他们已经按身高排成 了一列,同学按身高从1到n编号,你能告诉我最后哪些编号的同学站在了第一列么?
输入格式:
输入一个正整数n,表示班级的人数。
输出格式:
按顺序输出所有在第一列的同学对应的编号,每两个编号之间用一个空格隔开,最后一个编号后面没有空格。
输入样例:
11
输出样例:
1 3 5 7 9 11
// 分队列 // 给出一个整数n,输出1到n之间的奇数 #include <stdio.h> int main() { int n, i=1; scanf("%d", &n); for (; i<=n; i+=2){ if (i+1 ==n|| i==n) printf("%d", i); else printf("%d ", i); } return 0; }
- 奇偶个数(5分)(mooc第四周编程练习)
题目内容:
你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
输入格式:
一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。
输出格式:
两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。
输入样例:
9 3 4 2 5 7 -1
输出样例:
4 2
// 奇偶个数 #include<stdio.h> int main(){ int N, count_double=0, count_single=0; scanf("%d", &N); while(N != -1){ if (N%2 ==0) count_double +=1; else count_single +=1; scanf("%d", &N); } printf("%d %d", count_single, count_double); return 0; }
- 数字特征值(5分)(mooc第四周编程练习)
题目内容:
对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。
这里的计算可以用下面的表格来表示:
数字 |
3 |
4 |
2 |
3 |
1 |
5 |
数位 |
6 |
5 |
4 |
3 |
2 |
1 |
数字奇偶 |
奇 |
偶 |
偶 |
奇 |
奇 |
奇 |
数位奇偶 |
偶 |
奇 |
偶 |
奇 |
偶 |
奇 |
奇偶一致 |
0 |
0 |
1 |
1 |
0 |
1 |
二进制位值 |
32 |
16 |
8 |
4 |
2 |
1 |
你的程序要读入一个非负整数,整数的范围是[0,1000000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。
提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。
输入格式:
一个非负整数,整数的范围是[0,1000000]。
输出格式:
一个整数,表示计算结果。
输入样例:
342315
输出样例:
13
// 数字特征值 #include<stdio.h> #include<math.h> int main(){ int N, digit=0, temp; scanf("%d", &N); temp = 1; // 计算出输入数字位数 while(N/temp!=0) { digit++; temp = pow(10, digit); } int sum = 0; // 比较位数和位值的关系,相同二进制值位1,不同值为0,并将结果转化成10进制赋予sum for (int i=digit;i>=1;i--){ temp = pow(10, i-1); if (i%2 == (N/temp)%2) sum += pow(2, i-1); N %= temp; } printf("%d", sum); return 0; }
- 素数和(5分)(mooc第五周编程练习)
题目内容:
我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入格式:
两个整数,第一个表示n,第二个表示m。
输出格式:
一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入样例:
2 4
输出样例:
15
// 素数和(自己写的) #include<stdio.h> int main(){ int M, N, sum=0, count =0; scanf("%d %d", &M, &N); for (int i=2;;i++){ for (int j=1;j<=i;j++){ if (i%j==0&&j!=1&&j!=i) break; if (j == i){ count +=1; if(M<=count&& count<=N) sum += i; } } if(count>200) break; } printf("%d", sum); return 0; }
// 传统判断素数的方法(翁凯老师) #include<stdio.h> // 在已知的素数表内判断新数字是否为素数 int isPrime(int x, int knowPrimes[], int numbeOfKnownPrimes){ int ret = 1; int i; for ( i=0; i<numbeOfKnownPrimes; i++ ){ if ( x % knowPrimes[i] == 0){ ret = 0; break; } } return ret; } int main(){ // const int number = 100; // 网页开发环境中,这条语句不能通过 int prime[200] = {2}; int count = 1; int i = 3; while ( count < 200 ){ if ( isPrime(i, prime, count )) { prime[count++] = i; // 在素数表内判断后,由返回结果判断是否将新数字加入到素数表内 } i++; } // 输出素数表,每五个素数换行一次 // for ( i=0; i<200; i++){ // printf("%d", prime[i]); // if ( (i+1)%5 ) printf("\t"); // else printf("\n"); // } int start, end, sum=0; scanf("%d %d", &start, &end); for (int k=start-1;k<=end-1;k++) sum += prime[k]; printf("%d", sum); return 0; }
- 念整数(5分)(mooc第五周编程练习)
题目内容:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:
yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:
fu er san si yi
输入格式:
一个整数,范围是[-100000,100000]。
输出格式:
表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例:
-30
输出样例:
fu san ling
// 念整数 #include<stdio.h> #include<math.h> int main(){ int N, i, val, temp=1, digit=0; scanf("%d", &N); // 计算该整数的位数 while(N/temp!=0){ digit++; temp = pow(10, digit); } // 负整数需要特殊处理 if (N<0) { printf("fu "); N = -N; } // 整数为零需要特殊处理 if (digit ==0) printf("ling"); // 念整数核心实现部分 for (int j=digit-1;j>=0;j--){ temp = pow(10, j); val = N / temp; switch (val){ case 0:printf("ling"); break; case 1:printf("yi"); break; case 2:printf("er"); break; case 3:printf("san"); break; case 4:printf("si"); break; case 5:printf("wu"); break; case 6:printf("liu"); break; case 7:printf("qi"); break; case 8:printf("ba"); break; case 9:printf("jiu"); break; } N -= temp * val; if (j!=0) printf(" ");return 0; }
- 7-1 重要的话说三遍 (5 分)(PTA)
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— “I'm gonna WIN!”——连续输出三遍就可以了。
注意每遍占一行,除了每行的回车不能有任何多余字符。
// 重要的话说三遍 #include <stdio.h> int main(int argc, char **argv) { for(int i=0; i<3; i++){ printf("I'm gonna WIN!\n"); } return 0; }
-
7-2 I Love GPLT (5 分)(PTA)
这道超级简单的题目没有任何输入。
你只需要把这句很重要的话 —— I Love GPLT
——竖着输出就可以了。
所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
// I Love GPLT #include <stdio.h> int main() { char *p = "I Love GPLT"; while(*p){ printf("%c\n", *p++); } return 0; }
-
7-3 输出带框文字 (5 分)(PTA)
本题要求编写程序,输出指定的带框文字。
输入格式:
本题无输入
输出格式:
按照下列格式输出带框文字。
************
Welcome
************
// 输出带框文字 #include<stdio.h> int main(){ char a[]="************"; char b[]="Welcome"; // 标准输出可以控制第二行的Welcome占用10个位置,且靠右输出 printf("%s\n%9s\n%s",a, b, a); return 0; }
-
7-4 输出菱形图案 (5 分)(PTA)
本题要求编写程序,输出指定的由“A”组成的菱形图案。
输入格式:
本题无输入
输出格式:
按照下列格式输出由“A”组成的菱形图案。
// 输出菱形图案 #include<stdio.h> void diamond(int n){ for(int i=1; i<=n; i++){ if (i%2==1){ printf(" A\n"); } else { printf("A A\n"); } } } int main(){ diamond(3); return 0; }
-
7-5 输出倒三角图案 (5 分)(PTA本题要求编写程序,输出指定的由“*”组成的倒三角图案。
// 掉入陷阱的数字 #include<stdio.h> int number_trap(int N){ int sum=0, result; while(N){ sum += N % 10; N /= 10; } result = sum * 3 + 1; return result; } int main(){ int N, temp, result; scanf("%d", &N); temp = N; for (int i=1;;i++){ result = number_trap(temp); printf("%d:%d\n", i, result); if (temp == result) break; temp = result; } return 0; }
- 7-32 求交错序列前N项和 (15 分)(PTA)
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,结果保留三位小数。
输入样例:
5
输出样例:
0.917
// 求交错序列前N项和 #include<stdio.h> #include<math.h> int main() { int N; scanf("%d", &N); float sum = 0; for (float j = 1; j <= N; j++) { sum += (j/(2*j-1))*pow(-1, j+1); } printf("%.3f\n", sum); return 0; }
-
7-33 统计素数并求和 (20 分)(PTA)
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。
输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。
输入样例:
10 31
输出样例:
7 143
// 统计素数并求和 #include<stdio.h> const int maxNumber = 501; int main(){ int isPrime[maxNumber]; int i; int x; // 定义一个素数表,初始化假设isPrime表内数字均为素数 for ( i = 0; i<maxNumber; i++ ){ if (i == 1 || i == 0 ) isPrime[i] = 0; else isPrime[i] =1; } // 从较小的数字开始,排除个位素数的倍数,标记为0,遍历顺序由小到大 for ( x=2; x<maxNumber; x++){ if ( isPrime[x] ){ for ( i=2; i*x<maxNumber; i++){ isPrime[i*x] = 0; } } } int m, n, sum=0, count=0; scanf("%d %d", &m, &n); // 输出标记为非零的数组下标 for ( i=m; i<=n; i++){ if ( isPrime[i] ) { sum += i; count++; } } printf("%d %d\n", count, sum); return 0; }
-
7-34 求分数序列前N项和 (15 分)(PTA)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
输入格式:
输入在一行中给出一个正整数N。
输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。
输入样例:
20
输出样例:
32.66
// 求分数序列前N项和 #include<stdio.h> int main() { int N; double sum = 0, num_up = 2.0, num_down = 1.0; scanf("%d", &N); for (int i = 0; i < N; i++) { sum += num_up/num_down; num_up += num_down; num_down = num_up - num_down; } printf("%.2f\n", sum); return 0; }
-
7-35 猴子吃桃问题 (15 分)(PTA)
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
// 猴子吃桃问题 #include<stdio.h> int main() { int N = 0, num = 1; scanf("%d", &N); for (int i = N-1; i > 0; i--) { num = (num+1)*2; } printf("%d\n", num); return 0; }
-
7-36 韩信点兵 (10 分)(PTA)
在中国数学史上,广泛流传着一个"韩信点兵"的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按从1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。
输入格式:
本题无输入
输出格式:
输出韩信至少拥有的士兵人数。
// 韩信点兵 #include<stdio.h> int main() { int N; for (int i = 1;;i++) { if(i%5 == 1 && i%6 == 5 && i%7 == 4 && i%11 == 10) { printf("%i\n", i); break; } } return 0; }
-
7-37 输出整数各位数字 (15 分)(PTA)
本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。
输入格式:
输入在一行中给出一个长整型范围内的非负整数。
输出格式:
从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。
输入样例:
123456
输出样例:
1 2 3 4 5 6
// 输出整数各位数字 #include<stdio.h> int main() { int N, mask = 1, temp, t; scanf("%d", &N); t = N; while(t > 9) { t /= 10; mask *= 10; } // 这里采用mask作为循环的判定标识,是为了避免出现N=100这种情况,不能完全 // 输出每一位数字 do { temp = N / mask; printf("%d ", temp); N %= mask; mask /= 10; }while(mask > 0); return 0; }
-
7-38 支票面额 (15 分)(PTA)
一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?
输入格式:
输入在一行中给出小于100的正整数n。
输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。
输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution
// 支票面额 // Bad solution #include<stdio.h> int main(){ int X, Y, N, flag = 1; scanf("%d", &N); for (int i=0;i<=100 && flag;i++){ for (int j=1;j<=100 && flag ;j++){ if((2*i == j && 2*j == i-N )||(2*i+1 == j && 2*j-100== i-N)|| (2*i+2==j && 2*j -100==i+100-N)){ flag = 0; printf("%d.%d\n", i,j); } } } if (flag) printf("No Solution\n"); return 0; }
- 7-39 龟兔赛跑 (20 分)(PTA)
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@_@,兔子赢输出^_^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
// 龟兔赛跑 // 借鉴网上的思路,原来的方法太复杂了 #include<stdio.h> int main() { int rabbit = 0, tor = 0, T, rab_run = 1, t = 10; scanf("%d", &T); // 龟兔赛跑的核心 while(t <= T){ tor = 3 * t; rabbit += rab_run * 90; if(rabbit > tor){ rab_run = 0; t += 20; }else rab_run = 1; t += 10; } tor = 3 * T; // 例如当比赛时间为44分钟,兔子还没有超过乌龟,但由于while循环里最后一行t+=10 // 导致t=50 循环终止,为了补偿兔子的4分钟,特设此条件语句 if (rab_run) rabbit = rabbit + (10-(t-T))*9; if(rabbit > tor) printf("^_^ %d\n", rabbit); else if(tor > rabbit) printf("@_@ %d\n", tor); else printf("-_- %d\n", rabbit); return 0; }
-
7-40 到底是不是太胖了 (10 分)(PTA)
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
输入格式:
输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。
输出格式:
为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
输入样例:
3
169 136
150 81
178 155
输出样例:
You are wan mei!
You are tai shou le!
You are tai pang le!
// 到底是不是太胖了? #include<stdio.h> #include<math.h> void beauty(int h, int w) { double standard_w, temp_1, temp_2; standard_w = (h-100)*0.9; temp_1 = w/2.0 - standard_w; temp_2 = standard_w*0.1; if(fabs(temp_1) < temp_2) printf("You are wan mei!\n"); else if(w/2.0 > standard_w) printf("You are tai pang le!\n"); else printf("You are tai shou le!\n"); } int main() { int N, H, W; scanf("%d", &N); for (int i = 1; i <= N; i++) { scanf("%d %d", &H, &W); beauty(H, W); } return 0; }