中M2018春C入门和进阶练习集

暑假学C语言过程中写过的题目和答案,自己写的答案肯定还是存在错误的

7-6 重要的话说三遍(5 分)

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

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

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

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
printf("I'm gonna WIN!\n");
printf("I'm gonna WIN!\n");
printf("I'm gonna WIN!\n");
return 0;
}

7-8 I Love GPLT(5 分)

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

你只需要把这句很重要的话 —— I Love GPLT ——竖着输出就可以了。

所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。

1
2
3
4
5
6
#include <stdio.h>
int main()
{
printf("I\n \nL\no\nv\ne\n \nG\nP\nL\nT\n");
return 0;
}

7-4 输出带框文字(5 分)

本题要求编写程序,输出指定的带框文字。

输入格式:
本题无输入

输出格式:
按照下列格式输出带框文字。

************
 Welcome
************

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
printf("************\n");
printf(" Welcome\n");
printf("************\n");
return 0;
}

7-3 输出菱形图案(5 分)

本题要求编写程序,输出指定的由“A”组成的菱形图案。

输入格式:
本题无输入

输出格式:
按照下列格式输出由“A”组成的菱形图案。

 A
A  A
 A

1
2
3
4
5
6
7
8
#include<stdio.h>
int main()
{
printf(" A\n");
printf("A A\n");
printf(" A\n");
return 0;
}

7-13 输出倒三角图案(5 分)

本题要求编写程序,输出指定的由“*”组成的倒三角图案。

输入格式:
本题目没有输入。

输出格式:
按照下列格式输出由“*”组成的倒三角图案。

* * * *
 * * *
  * *
   *

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
printf("* * * *\n");
printf(" * * *\n");
printf(" * *\n");
printf(" *\n");
return 0;
}

7-15 厘米换算英尺英寸(15 分)

如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。

输入格式:
输入在一行中给出1个正整数,单位是厘米。

输出格式:
在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。

输入样例:
170
输出样例:
5 6

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{
int cm , foot , inch;
double h ;
scanf("%d",&cm);
foot = cm / 30.48;
h = cm/30.48-foot;
inch = h * 12 ;
printf("%d %d",foot,inch);
return 0 ;
}

7-1 计算摄氏温度(10 分)

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C=5×(F−32)/9。题目保证输入与输出均在整型范围内。

输入格式:
输入在一行中给出一个华氏温度。

输出格式:
在一行中按照格式“Celsius = C”输出对应的摄氏温度C的整数值。

输入样例:
150
输出样例:
Celsius = 65

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main()
{
int f;
int c;
scanf("%d",&f);
c=int(5*(f-32)/9.0);
printf("Celsius = %d",c);
return 0;
}

7-9 是不是太胖了(5 分)

据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤是公斤的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)

输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。

输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。

输入样例:
169
输出样例:
124.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<stdio.h>
int main()
{
int height ;

double tizhong;

scanf("%d",&height);

tizhong = ( (height - 100) * 0.9 ) * 2 ;

printf("%.1f",tizhong);

return 0 ;

}

7-2 求整数均值(10 分)

本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。

输入格式:
输入在一行中给出4个整数,其间以空格分隔。

输出格式:
在一行中按照格式“Sum = 和; Average = 平均值”顺序输出和与平均值,其中平均值精确到小数点后一位。

输入样例:
1 2 3 4
输出样例:
Sum = 10; Average = 2.5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main()
{
double a , b , c , d , sum , average;

scanf("%lf %lf %lf %lf",&a,&b,&c,&d);

sum = a+b+b+d;
average = (a+b+c+d)/4;

printf("Sum = %g; Average = %.1f",sum,average);

return 0 ;

}

7-14 算术入门之加减乘除(10 分)

对于输入的两个整数,按照要求输出其和差积商。

输入格式:
在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。

输出格式:
共四行,格式是:

[a] + [b] = [a+b]
[a] - [b] = [a-b]
[a] [b] = [ab]
[a] / [b] = [a/b]
其中,带有方括号的内容(如[a]、[b]、[a+b]等)表示相应整数或运算结果的值,在输出时要用实际的值代替。

并且:如果a能够被b整除,那么a/b应输出为整数格式,否则a/b输出为带两位小数的格式。

提示:注意表达式中的空格。

输入样例1:
6 3
输出样例1:
6 + 3 = 9
6 - 3 = 3
6 3 = 18
6 / 3 = 2
输入样例2:
8 6
输出样例2:
8 + 6 = 14
8 - 6 = 2
8
6 = 48
8 / 6 = 1.33

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main()
{
double a,b;
scanf("%lf %lf",&a,&b);
printf("%g + %g = %g\n",a,b,a+b);
printf("%g - %g = %g\n",a,b,a-b);
printf("%g * %g = %g\n",a,b,a*b);
printf("%g / %g = %.3g",a,b,a/b);
return 0 ;
}

7-5 计算平均分(5 分)

已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该生3门课程的平均成绩(结果按整型输出)。

输入格式:
本题无输入

输出格式:
按照下列格式输出结果:

math = 87, eng = 72, comp = 93, average = 计算所得的平均成绩

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main()
{

int math = 87 , eng = 72 , comp = 93 , average ;

average = ( math + eng + comp ) / 3 ;

printf("math = %d, eng = %d, comp = %d, average = %d" , math , eng , comp ,average ) ;

return 0 ;
}

7-18 日期格式化(5 分)

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。下面请你写个程序,自动把读入的美国格式的日期改写成中国习惯的日期。

输入格式:
输入在一行中按照“mm-dd-yyyy”的格式给出月、日、年。题目保证给出的日期是1900年元旦至今合法的日期。

输出格式:
在一行中按照“yyyy-mm-dd”的格式给出年、月、日。

输入样例:
03-15-2017
输出样例:
2017-03-15

1
2
3
4
5
6
7
#include<stdio.h>
int main()
{
int y,m,d;
scanf("%d-%d-%d",&m,&d,&y);
printf("%d-%.2d-%.2d",y,m,d);
}

7-7 后天(5 分)

如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。

输入格式:
输入第一行给出一个正整数D(1 ≤ D ≤ 7),代表星期里的某一天。

输出格式:
在一行中输出D天的后天是星期几。

输入样例:
3
输出样例:
5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
int main(){

int D ;
scanf("%d",&D);
if (D == 1) {
D = 3 ;
}
else if (D == 2){
D = 4 ;
}
else if (D == 3){
D = 5 ;
}
else if (D == 4){
D = 6 ;
}
else if (D == 5){
D = 7 ;
}
else if (D == 6){
D = 1 ;
}
else if (D == 7){
D = 2 ;
}

printf("%d",D);
return 0 ;
}

7-16 然后是几点(15 分)

有时候人们用四位数字表示一个时间,比如1106表示11点零6分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。

读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计算当前时间经过那么多分钟后是几点,结果也表示为四位数字。当小时为个位数时,没有前导的零,即5点30分表示为530。注意,第二个数字表示的分钟数可能超过60,也可能是负数。

输入格式:
输入在一行中给出2个整数,分别是四位数字表示的起始时间、以及流逝的分钟数,其间以空格分隔。注意:在起始时间中,当小时为个位数时,没有前导的零,即5点30分表示为530;流逝的分钟数可能超过60,也可能是负数。

输出格式:
输出四位数字表示的终止时间。题目保证起始时间和终止时间在同一天内。

输入样例:
1120 110
输出样例:
1310

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(){
int hours , min , sj , time , hours2 , min2 ,h1 ,h2;
scanf("%d%d",&sj , &time);
hours = sj / 100; //获取输入时间的小时数
min = sj % 100; //获取输入时间的分钟数
hours2 = time / 60 ; //求输入时间的小时数
min2 = time % 60 ; //求输入时间的分钟数

h1 = ( (hours+hours2) * 60 + min + min2 ) / 60 ;
h2 = ( (hours+hours2) * 60 + min + min2 ) % 60 ;

printf("%d%.2d",h1,h2);
return 0 ;
}

7-17 BCD解密(10 分)

BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!

现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。

输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。

输出格式:
输出对应的十进制数。

输入样例:
18
输出样例:
12

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(){
int e;
scanf("%d", &e);
int n = e/16*10 + (e % 16);
printf("%d\n", n);
return 0;
}

7-16 计算符号函数的值(10 分)

对于任一整数n,符号函数sign(n)的定义如下:

请编写程序计算该函数对任一输入整数的值。

输入格式:
输入在一行中给出整数n。

输出格式:
在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。

输入样例1:
10
输出样例1:
sign(10) = 1
输入样例2:
0
输出样例2:
sign(0) = 0
输入样例3:
-98
输出样例3:
sign(-98) = -1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h> 
int main(){

int n , sing;

scanf("%d",&n);

if (n<0) {
sing = -1;
}
else if (n==0) {
sing = 0;
}
else {
sing = 1;
}

printf("sign(%d) = %d",n,sing);

return 0 ;
}

7-17 成绩转换(15 分)

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
输入格式:
输入在一行中给出一个整数的百分制成绩。

输出格式:
在一行中输出对应的五分制成绩。

输入样例:
90
输出样例:
A

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main (){

int cj;
scanf("%d",&cj);

if (cj>=90) {
printf("A");
}

else if (cj>=80) {
printf("B");
}
else if (cj>=70) {
printf("C");
}
else if (cj>=60) {
printf("D");
}
else {
printf("E");
}

return 0 ;
}

7-18 出租车计价(15 分)

本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:

起步里程为3公里,起步费10元;
超起步里程后10公里内,每公里2元;
超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
输入格式:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。

输出格式:
在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。

输入样例1:
2.6 2
输出样例1:
10
输入样例2:
5.1 4
输出样例2:
14
输入样例3:
12.5 9
输出样例3:
34

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main() {
double fy,lc;
int dd;
scanf("%lf %d",&lc , &dd);

if (lc>10) {
fy = 24 + (lc-10) * 3 + dd/5*2;
}
else if (lc>3) {
fy = 10 + (lc-3) * 2 + dd/5*2;
}
else if (lc>0) {
fy = 10 + dd/5*2;
}
else {
fy = dd/5*2;
}
printf("%.0f",fy);

return 0 ;
}

7-19 计算天数(15 分)

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

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

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

输入样例1:
2009/03/02
输出样例1:
61
输入样例2:
2000/03/02
输出样例2:
62

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/*
28/29day 2
30day 4 6 9 11
31day 1 3 5 7 8 10 12
使用数组建立月份和月份天数的对应关系
*/

#include <stdio.h>
int main (){
int rnts[12] = {31,29,31,30,31,30,31,31,30,31,30,31} ; //数组记录闰年每个月的天数
int frts[12] = {31,28,31,30,31,30,31,31,30,31,30,31} ; //数组记录非闰年每个月的天数
int year,month,day,sum;
int i = 0 ;
scanf("%d/%d/%d",&year,&month,&day) ; //接受输入

if (year%4 == 0&&year%100 != 0 || year%400 == 0) //判断是否为闰年
{

for (i=0;i < month;i++) //for循环统计天数
{
sum = sum + rnts[i];
}

sum = sum + day ;
printf("%d",sum-rnts[month-1]); //输出结果
}

else
{
for (i=0;i < month;i++) //for循环统计天数
{
sum = sum + frts[i];
}

sum = sum + day ;
printf("%d",sum-frts[month-1]); //输出结果
}

return 0 ;
}

7-20 简单计算器(20 分)

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。

输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。

输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。

输入样例:
1+2*10-10/2=
输出样例:
10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<stdio.h>
int main()
{
int value1,value2;
int sum=0;
char ch;
scanf("%d",&value1);
while((ch=getchar())!='=')
{
scanf("%d",&value2);
if(ch=='/'&&value2==0){
printf("ERROR\n");
return 0;
}
switch(ch)
{
case '+':sum=value1+value2;break;
case '-':sum=value1-value2;break;
case '*':sum=value1*value2;break;
case '/':sum=value1/value2;break;
default:printf("ERROR\n");return 0;

}
value1=sum;
}
printf("%d\n",value1);
return 0;
}

7-21 超速判断(10 分)

模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。

输入格式:
输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。

输出格式:
在一行中输出测速仪显示结果,格式为:Speed: V - S,其中V是车速,S或者是Speeding、或者是OK。

输入样例1:
40
输出样例1:
Speed: 40 - OK
输入样例2:
75
输出样例2:
Speed: 75 - Speeding

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main (){

int v;
scanf("%d",&v);

if (v<=60) {
printf("Speed: %d - OK",v);

}
else {
printf("Speed: %d - Speeding",v);
}
return 0 ;
}

7-22 用天平找小球(10 分)

三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。

输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。

输出格式:
在一行中输出唯一的那个不一样的球。

输入样例:
1 1 2
输出样例:
C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int main (){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
if (a==b) {
printf("C");
}
else if (a==c) {
printf("B");
}
else {
printf("A");
}

return 0 ;
}

7-23 分段计算居民水费(10 分)

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费y(元)与月用水量x(吨)相关:当x不超过15吨时,y=4x/3;超过后,y=2.5x−17.5。请编写程序实现水费的计算。

输入格式:
输入在一行中给出非负实数x。

输出格式:
在一行输出应交的水费,精确到小数点后2位。

输入样例1:
12
输出样例1:
16.00
输入样例2:
16
输出样例2:
22.50

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main (){
int x ;
double y;
scanf("%d",&x) ;
if (x <= 15){

y = 4*x/3.0 ;
}
else {

y = 2.5*x - 17.5 ;
}

printf("%.2f",y);

return 0 ;
}

7-24 猜数字游戏(15 分)

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
int main (){
int sjs,N,daan;
int i=0 ; //定义已猜测次数i
scanf("%d %d",&sjs,&N); // 输入游戏产生的随机数,以及猜测的最大次数N

do {
scanf("%d",&daan) ; //输入每次的猜测结果

if (daan < 0){ //检测用户是否输入了负数
printf("Game Over\n") ;
break ;
}
else if (daan>sjs ) { //判断输入的猜测是否比产生的随机数大

i++ ;
if (i>N) { //如果猜测次数已经大于最大猜测次数N 就输出game over 并退出循环
printf("Game Over\n") ;
break ;
}
printf ("Too big\n") ;
}
else if (daan<sjs) { //判断输入的猜测是否比产生的随机数小

i++ ;
if (i>N) { //如果猜测次数已经大于最大猜测次数N就输出game over 并退出循环
printf("Game Over\n") ;
break ;
}
printf ("Too small\n");
}
else { //猜测结果与产生的随机数相同
i++ ;
if (i == 1) { //一次就猜到
printf("Bingo!\n") ;
}

else if (i > N) { //超过N次也没猜测到
printf("Game Over\n") ;
}

else if (i > 3 ) { //猜测次数在N和3之间
printf("Good Guess!\n") ;
}

else if (i <= 3) { //3次以内猜到
printf("Lucky You!\n") ;
}

}

} while (daan != sjs) ;
return 0;
}

7-25 求奇数和(15 分)

本题要求计算给定的一系列正整数中奇数的和。

输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。

输出格式:
在一行中输出正整数序列中奇数的和。

输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(){
int n;
int sum = 0 ;
do {
scanf("%d" ,&n) ;
if (n%2 == 1) {

sum = sum + n ;
}

} while (n > 0) ;

printf("%d",sum) ;

return 0;
}

7-26 最大公约数和最小公倍数(15 分)

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:
输入在一行中给出两个正整数M和N(≤1000)。

输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:
511 292
输出样例:
73 2044

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int main() {
int M,N ;
int min ;
scanf("%d %d",&M,&N) ;
if (M<N) {
min = M;
}
else {
min = N ;
}
int ret = 0;
int i ;
for (i=1;i<=min;i++) {

if (M%i == 0) {
if (N%i == 0) {
ret = i;
}
}
}
printf("%d %d",ret,M*N/ret) ;
return 0 ;
}

7-27 兔子繁衍问题(15 分)

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:
输入在一行中给出一个不超过10000的正整数N。

输出格式:
在一行中输出兔子总数达到N最少需要的月数。

输入样例:
30
输出样例:
9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main(){
//兔子繁殖问题 斐波那契数列
int a[10000] = {1,1} ;
int i = 2 ;

do {
a[i] = a[i-1] + a[i-2] ;
i++;

} while (i<10000) ; //将第一个月到的第10000个月的兔子数量依次存入数组a[10000];
int sum = 0;
int x = 0;
int n;
scanf("%d",&n) ;
do {
sum = a[x] ;
x++;
} while (sum<n) ;
printf("%d",x) ;
return 0 ;
}

7-28 求整数的位数及各位数字之和(15 分)

对于给定的正整数N,求它的位数及其各位数字之和。

输入格式:
输入在一行中给出一个不超过10
​9
​​ 的正整数N。

输出格式:
在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

输入样例:
321
输出样例:
3 6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main () {
int i ;
int n;
scanf("%d",&n);
int b = 0 ;
int sum = 0 ;
int m = n ;
while (n>0) {
n = n/10 ;
b++ ;
}
int a = 1 ;
int f ;
for (a=1 ;a<=b;a++) {
f = m % 10 ;
m = m / 10 ;
sum = sum + f ;
}
printf("%d %d",b,sum);
return 0 ;
}

7-29 二分法求多项式单根(20 分)

二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f(r)=0。

二分法的步骤为:

检查区间长度,如果小于给定阈值,则停止,输出区间中点(a+b)/2;否则
如果f(a)f(b)<0,则计算中点的值f((a+b)/2);
如果f((a+b)/2)正好为0,则(a+b)/2就是要求的根;否则
如果f((a+b)/2)与f(a)同号,则说明根在区间[(a+b)/2,b],令a=(a+b)/2,重复循环;
如果f((a+b)/2)与f(b)同号,则说明根在区间[a,(a+b)/2],令b=(a+b)/2,重复循环。
本题目要求编写程序,计算给定3阶多项式f(x)=a3 x3 +a2 x 2 +a1x+a0在给定区间[a,b]内的根。

输入格式:
输入在第1行中顺序给出多项式的4个系数a3 、a2、a1、a0,在第2行中顺序给出区间端点a和b。题目保证多项式在给定区间内存在唯一单根。

输出格式:
在一行中输出该多项式在该区间内的根,精确到小数点后2位。

输入样例:
3 -1 -3 1
-0.5 0.5
输出样例:
0.33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
double a3,a2,a1,a0;
double f(double n) ;
int main() {

double a,b;
scanf("%lf%lf%lf%lf",&a3,&a2,&a1,&a0) ;
scanf("%lf%lf",&a,&b) ;
if ((f(a)*f(b))>0) {
printf("%f",(a+b)/2) ;
}
else {
while(a <= b - 0.001 && f(a) * f(b) <= 0) {
if( f((a+b)/2) == 0 ) {
break ;
}
else if(f((a+b)/2) < 0) {
if (f(a) >0 ) {
b = (a+b)/2 ;
}
else {
a = (a+b)/2 ;
}
}
else if (f((a+b)/2) > 0) {
if ( f(a) > 0) {
a = (a+b)/2 ;
}
else {
b = (a+b)/2 ;
}
}

}
}
printf("%.2f",(a+b)/2) ;
return 0;
}

double f(double n) {
double x = n;
double sum = a3*x*x*x+a2*x*x+a1*x+a0;
return sum;
}

7-30 念数字(15 分)

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。

提示:整数包括负数、零和正数。

输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如 yi er san si。

输入样例:
-600
输出样例:
fu liu ling ling

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
int main (){
int n ,i=1;
scanf("%d",&n);

if (n<0) {
printf("fu ") ;
n = -n ;
}
int m =n;
while (n > 9) {
n = n /10 ;
i=i*10 ;
}

do {
int f=m/i;
switch (f) {
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;
}

if (i>9) {
printf(" ");
}
m = m % i ;
i = i/10 ;
} while (i>0) ;
return 0 ;
}

7-31 掉入陷阱的数字(15 分)

对任意一个自然数N
​0 ,先将其各位数字相加求和,再将其和乘以3后加上1,变成一个新自然数N​1;然后对N1重复这种操作,可以产生新自然数N2;……多次重复这种操作,运算结果最终会得到一个固定不变的数Nk,就像掉入一个数字“陷阱”。

本题要求对输入的自然数,给出其掉入“陷阱”的过程。

输入格式:
在一行内给出一个自然数N0(N​0​​ <30000)。

输出格式:
对于输入的N0,逐行输出其掉入陷阱的步骤。第i行描述N掉入陷阱的第i步,格式为: i:N​i(i≥1)。当某一步得到的自然数结果N​k(k≥1)与上一步N​k−1 相同时,停止输出。

输入样例:
5
输出样例:
1:16
2:22
3:13
4:13

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
int qiuhe(int n) ;
int main (){
int p;
scanf("%d",&p) ;
int number = 0;
int z;
while(p != z) {
number++;
z = p;
p = qiuhe(p) ;
printf("%d:%d\n",number,p) ;
}
return 0 ;
}
int qiuhe(int n) {
int i = 0 ;
int m = n ;
while (n > 0) {
n = n /10 ;
i++ ;
}
int f,a,sum=0;
for (a=1;a<=i;a++) {

f = m %10 ;
m = m /10 ;
sum = sum + f ;
}
return sum*3+1; //ÉèÖÃÒ»¸ö¸÷λÊýÇóºÍµÄº¯Êý
}

7-32 求交错序列前N项和(15 分)

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,结果保留三位小数。

输入样例:
5
输出样例:
0.917

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main () {
int n;
int m = 1 ;
double sum = 0;
scanf("%d",&n) ;
while (m<=n) {
if (m%2 == 1) {

sum = sum + m/ (2.0*m -1) ;
m++ ;
}
else {
sum = sum - m/ (2.0*m -1) ;
m++ ;
}
}
printf("%.3f",sum) ;
return 0 ;
}

7-33 统计素数并求和(20 分)

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:
10 31
输出样例:
7 143

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
int main(){
int m,n;
scanf("%d %d",&m,&n) ;
int i,j;
int sum = 0 ;
int number = 0;
for(i=m;i<=n;i++) {
int numb = 1;
if (i<2) {
numb = 0;
}
for(j=2;j<i;j++) {
if(i%j == 0) {
numb = 0;
break;
}
}
if(numb ==1) {
sum = sum + i;
number++;
}
}
printf("%d %d",number,sum) ;
return 0;
}

7-34 求分数序列前N项和(15 分)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:
20
输出样例:
32.66

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main() {
double sum = 2.0 ;
int i = 1;
int N ;
double fz = 2.0,fm = 1.0,fz2=0.0;
scanf("%d",&N) ;
while (i<N) {

fz2=fz;
fz=fz+fm;
fm=fz2; //求出第N项的值
sum = sum +(fz/fm);
i++;
}
printf("%.2f",sum);
return 0 ;
}

7-35 猴子吃桃问题(15 分)

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:
输入在一行中给出正整数N(1<N≤10)。

输出格式:
在一行中输出第一天共摘了多少个桃子。

输入样例:
3
输出样例:
10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main() {
double sum = 2.0 ;
int i = 1;
int N ;
double fz = 2.0,fm = 1.0,fz2=0.0;
scanf("%d",&N) ;
while (i<N) {
fz2=fz;
fz=fz+fm;
fm=fz2; //求出第N项的值
sum = sum +(fz/fm);
i++;
}
printf("%.2f",sum);
return 0 ;
}

7-36 韩信点兵(10 分)

在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:

按从1至5报数,记下最末一个士兵报的数为1;
再按从1至6报数,记下最末一个士兵报的数为5;
再按从1至7报数,记下最末一个士兵报的数为4;
最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。

输入格式:
本题无输入

输出格式:
输出韩信至少拥有的士兵人数。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h> 
int main () {
int n = 1;
for(n=21;;n++){
if(n%5==1 && n%6==5 && n%7==4 && n%11==10){
printf("%d",n) ;
break;
}
}
return 0 ;
}

7-37 输出整数各位数字(15 分)

本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。

输入格式:
输入在一行中给出一个长整型范围内的非负整数。

输出格式:
从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。

输入样例:
123456
输出样例:
1 2 3 4 5 6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main()

{
int n, mask;
scanf("%d", &n);
mask = 1;
while (n / mask > 9)
{
mask *= 10;
}
while (mask > 0)
{
printf("%d ", n / mask);
n %= mask;
mask /= 10;
}

return 0;
}

7-38 支票面额(15 分)

一个采购员去银行兑换一张y元f分的支票,结果出纳员错给了f元y分。采购员用去了n分之后才发觉有错,于是清点了余额尚有2y元2f分,问该支票面额是多少?

输入格式:
输入在一行中给出小于100的正整数n。

输出格式:
在一行中按格式y.f输出该支票的原始面额。如果无解,则输出No Solution。

输入样例1:
23
输出样例1:
25.51
输入样例2:
22
输出样例2:
No Solution

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h> 
int main() {
int n,f,y,c=0;
scanf("%d",&n) ;
for (y=0;y<100;y++) {
for(f=y;f<100;f++) {
if (199*y+n == 98*f) {
printf("%d.%d",y,f) ;
c=1;
}
}
}
if (c==0) {
printf("No Solution") ;
}

return 0 ;
}

7-39 龟兔赛跑(20 分)

乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?

输入格式:
输入在一行中给出比赛时间T(分钟)。

输出格式:
在一行中输出比赛的结果:乌龟赢输出@@,兔子赢输出^^,平局则输出-_-;后跟1空格,再输出胜利者跑完的距离。

输入样例:
242
输出样例:
@[email protected] 726

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h> 
#include <string.h>
int main() {
int m,i,xiuxi = 0;
int gui = 0 , tuzi = 0;
scanf("%d",&m) ;
for (i=0;i<m;i++) {
gui += 3 ;
if ( gui<tuzi && i%10==0 && xiuxi == 0) {
xiuxi = 30;
}
if (xiuxi == 0) {
tuzi += 9 ;
}
else {
xiuxi--;
}

}

char bq[5] ;
int cj;
if (tuzi > gui) {
strcpy(bq,"^_^") ;
cj = tuzi;
}
else if (gui > tuzi) {
strcpy(bq,"@[email protected]") ;
cj = gui ;
}
else {
strcpy(bq,"-_-") ;
}
printf("%s %d",bq,cj) ;



return 0 ;
}

7-40 到底是不是太胖了(10 分)

据说一个人的标准体重应该是其身高(单位:厘米)减去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!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
#include <math.h>
int main() {
int n,i=1,sg,tz;
double bztz,fw1,fw2,tz1;

scanf("%d",&n);
while (i<=n) {

scanf("%d %d",&sg,&tz) ;//输入身高和真实体重

bztz = (sg-100.0)*1.8 ; //计算标准体重并赋值给变量 bztz
fw1 = bztz*1.1; //计算标准体重的最大值,并赋值给 fw
fw2 = bztz*0.9;



if (tz>fw1) {
printf("You are tai pang le!\n");

}

else if(tz<=fw2){
printf("You are tai shou le!\n");
}

else {
printf("You are wan mei!\n");

}

i ++;
}

return 0 ;
}

7-41 计算阶乘和(10 分)

对于给定的正整数N,需要你计算 S=1!+2!+3!+…+N!。

输入格式:
输入在一行中给出一个不超过10的正整数N。

输出格式:
在一行中输出S的值。

输入样例:
3
输出样例:
9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main(){

int n;
int sum = 1,sums = 0,h = 1,i = 1;
scanf("%d",&n) ;
while (i<=n) {
while (h<=i){
sum = sum * h;
h++;
}
sums = sums + sum ;
i++;
}
printf("%d",sums) ;

return 0 ;
}

7-42 整除光棍(20 分)

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:
输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。

输入样例:
31
输出样例:
3584229390681 15

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {

int x, n = 0;
long long y = 0,s = 0;
scanf("%d",&x) ;
do {
y = y*10 + 1;
n ++ ;
s = y / x;
} while (y%x != 0) ;
printf("%lld %d",s,n) ;
return 0 ;
}

7-43 Shuffling Machine(20 分)

Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid “inside jobs” where employees collaborate with gamblers by performing inadequate shuffles, many casinos employ automatic shuffling machines. Your task is to simulate a shuffling machine.

The machine shuffles a deck of 54 cards according to a given random order and repeats for a given number of times. It is assumed that the initial status of a card deck is in the following order:

S1, S2, …, S13,
H1, H2, …, H13,
C1, C2, …, C13,
D1, D2, …, D13,
J1, J2
where “S” stands for “Spade”, “H” for “Heart”, “C” for “Club”, “D” for “Diamond”, and “J” for “Joker”. A given order is a permutation of distinct integers in [1, 54]. If the number at the i-th position is j, it means to move the card from position i to position j. For example, suppose we only have 5 cards: S3, H5, C1, D13 and J2. Given a shuffling order {4, 2, 5, 3, 1}, the result will be: J2, H5, D13, S3, C1. If we are to repeat the shuffling again, the result will be: C1, H5, S3, J2, D13.

Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer K (≤20) which is the number of repeat times. Then the next line contains the given order. All the numbers in a line are separated by a space.

Output Specification:
For each test case, print the shuffling results in one line. All the cards are separated by a space, and there must be no extra space at the end of the line.

Sample Input:
2
36 52 37 38 3 39 40 53 54 41 11 12 13 42 43 44 2 4 23 24 25 26 27 6 7 8 48 49 50 51 9 10 14 15 16 5 17 18 19 1 20 21 22 28 29 30 31 32 33 34 35 45 46 47
Sample Output:
S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13 D10 D11 D12 S3 S4 S6 S10 H1 H2 C13 D2 D3 D4 H6 H3 D13 J1 J2 C1 C2 C3 C4 D1 S5 H5 H11 H12 C6 C7 C8 C9 S2 S8 S9 H10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
int main() {
int k;
int star[55] , bh[55] , ch[55];
char num[] = {"SHCDJ"} ;
scanf("%d",&k);
int i,j;
for (i=1;i<55;i++){
scanf("%d",&star[i]) ; //输入洗牌要变化的位置,存储到数组star
bh[i] = i; //同时生成牌,用数字1-54来代替,这也是for循环从1开始的原因
}
for (j=1;j<=k;j++) { //控制洗牌次数
for(i=1;i<55;i++) {
ch[i] = bh[i] ; //将bh数组的元素存入到ch数组中,用来洗牌
}
for(i=1;i<55;i++){ //开始洗牌
bh[star[i]] = ch[i] ; //根据题意,因为此时bh和ch数组完全相同,
} //所以只要按照star数组的洗牌要求,将ch[i]中的数字,替换到bh[star[i]]的位置即可;

}
for (i=1;i<55;i++) {
bh[i] = bh[i] - 1;//要将1-54转换成字母,若不减1,bh[i]/13,无法转换成对应的字母
printf("%c%d",num[bh[i]/13],bh[i]%13+1);
if (i != 54) {
printf(" ");//若输出不是最后一个则输出一个空格
}
}

return 0;
}

7-44 黑洞数(20 分)

黑洞数也称为陷阱数,又称“Kaprekar问题”,是一类具有奇特转换特性的数。

任何一个各位数字不全相同的三位数,经有限次“重排求差”操作,总会得到495。最后所得的495即为三位黑洞数。所谓“重排求差”操作即组成该数的数字重排后的最大数减去重排后的最小数。(6174为四位黑洞数。)

例如,对三位数207:

第1次重排求差得:720 - 27 = 693;
第2次重排求差得:963 - 369 = 594;
第3次重排求差得:954 - 459 = 495;
以后会停留在495这一黑洞数。如果三位数的3个数字全相同,一次转换后即为0。

任意输入一个三位数,编程给出重排求差的过程。

输入格式:
输入在一行中给出一个三位数。

输出格式:
按照以下格式输出重排求差的过程:

序号: 数字重排后的最大数 - 重排后的最小数 = 差值
序号从1开始,直到495出现在等号右边为止。

输入样例:
123
输出样例:
1: 321 - 123 = 198
2: 981 - 189 = 792
3: 972 - 279 = 693
4: 963 - 369 = 594
5: 954 - 459 = 495

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
int main() {
int ch[3] ;
int n , i , t , k = 0 , a = 0;
int max,min;
scanf("%d",&n) ;
if (n == 495) {
printf("1: 954 - 459 = 495") ; //如果输入的495,则特殊处理,直接输出这种情况;
}
while(n != 495) {
ch[0] = n / 100 ;
ch[1] = (n / 10) % 10 ;
ch[2] = (n % 100) % 10; //将输入的数字逐位存储到数组ch中;
for (i=0;i<3;i++) {
for(t=i+1;t<3;t++) {
if(ch[i]<ch[t]) {
k = ch[i] ;
ch[i] = ch[t] ;
ch[t] = k ;
}
}
} //将数组中的数,从大到小,排列到ch[0] ch[1] ch[2]
max = ch[0]*100 + ch[1]*10 +ch[2]; //计算最大值
min = ch[2]*100 + ch[1]*10 +ch[0]; //计算最小值
n = max - min; //计算差值
a++; //计数
if (ch[0] == ch[1] && ch[1] == ch[2]) {
printf("%d: %d - %d = %d",a,max,min,n);
break;
}
printf("%d: %d - %d = %d",a,max,min,n);
if (n != 495 ) {
printf("\n") ;
}
}
return 0 ;
}

7-45 找完数(20 分)

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:
输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:
逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:
2 30
输出样例:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
int main(){
int n,m,i,j,sum,num=0;
scanf("%d %d",&m,&n);
for(i=m;i<=n;i++){
if(i==1) continue; //1不是完数
sum=1;
for(j=2;j<i;j++) //因子数之和
if(i%j==0) sum+=j;
if(sum==i){ //之和相等,既是完数
printf("%d = 1",i); //每一项都有1
for(j=2;j<i;j++)
if(i%j==0)
printf(" + %d",j); //之后再加上后面的因子
printf("\n");
num++;
}
}
if(num==0) printf("None\n"); //num是用来统计出现的完数个数
return 0;
}

7-46 爬动的蠕虫(15 分)

一条蠕虫长1寸,在一口深为N寸的井的底部。已知蠕虫每1分钟可以向上爬U寸,但必须休息1分钟才能接着往上爬。在休息的过程中,蠕虫又下滑了D寸。就这样,上爬和下滑重复进行。请问,蠕虫需要多长时间才能爬出井?

这里要求不足1分钟按1分钟计,并且假定只要在某次上爬过程中蠕虫的头部到达了井的顶部,那么蠕虫就完成任务了。初始时,蠕虫是趴在井底的(即高度为0)。

输入格式:
输入在一行中顺序给出3个正整数N、U、D,其中D<U,N不超过100。

输出格式:
在一行中输出蠕虫爬出井的时间,以分钟为单位。

输入样例:
12 3 1
输出样例:
11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h> 
int main(){
int n,u,d;
int h = 0 ,i = 0;
scanf("%d%d%d",&n,&u,&d) ;
while (h<n) {
i++;
if (i%2 == 1) {
h = h + u;
}
else {
h = h - d;
}
}
printf("%d",i);
return 0 ;
}

7-47 二进制的前导的零(10 分)

计算机内部用二进制来表达所有的值。一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,有27个0。我们把这些0称作前导的零。

现在,你的任务是写一个程序,输入一个整数,输出在32位表达下它前导的零的个数。

输入格式:
一个整数,在32位的整数可以表达的范围内。

输出格式:
一个整数,表达输入被表达为一个32位的二进制数时,在第一个1之前的0的数量。

输入样例:
256
输出样例:
23

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h> 
int main () {
int a[32];
int n,m;
scanf("%d",&n) ;
int i = 0 ;
if (n==0) {
printf("32") ;
}
else if (n<0) {
printf("0") ;
}
else{

while(n>0) {
a[i] = n % 2;
n = n / 2;
i++;
}
for(i=31;i>0;i--) {
if(a[i] == 1) {
m = i+1 ;
}

}
printf("%d",32-m) ;
}
return 0 ;
}

7-48 求组合数(15 分)

本题要求编写程序,根据公式C
​n
​m
​​ =
​m!(n−m)!

​n!
​​ 算出从n个不同元素中取出m个元素(m≤n)的组合数。

建议定义和调用函数fact(n)计算n!,其中n的类型是int,函数类型是double。

输入格式:
输入在一行中给出两个正整数m和n(m≤n),以空格分隔。

输出格式:
按照格式“result = 组合数计算结果”输出。题目保证结果在double类型范围内。

输入样例:
2 7
输出样例:
result = 21

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
double fact(int n) ;
int main() {
double result;
int n,m;
scanf("%d %d",&m,&n);
result =( fact(n) )/( fact(m) * fact(n-m) ) ;
printf("result = %g",result) ;



return 0 ;
}
double fact(int n) {
int i = 1;
double sum = 1 ;
while(i<=n) {
sum = sum * i;
i++;
}
return sum;
}

7-49 Have Fun with Numbers(20 分)

Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number consisting exactly the numbers from 1 to 9, only in a different permutation. Check to see the result if we double it again!

Now you are suppose to check if there are more numbers with this property. That is, double a given number with k digits, you are to tell if the resulting number consists of only a permutation of the digits in the original number.

Input Specification:
Each input contains one test case. Each case contains one positive integer with no more than 20 digits.

Output Specification:
For each test case, first print in a line “Yes” if doubling the input number gives a number that consists of only a permutation of the digits in the original number, or “No” if not. Then in the next line, print the doubled number.

Sample Input:
1234567899
Sample Output:
Yes
2469135798

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <string.h>

int main() {
char ah[21] ;
char bh[21] ;
gets(ah) ;
int len = strlen(ah) ;
int i,j , flag1 = 1 ,abs,m=0,s;

if ((ah[0]-'0')*2>= 10) { //Èç¹ûµÚһλ>=5£¬*2µ¼ÖÂλÊý¸Ä±ä ¿Ï¶¨²»ÏàµÈ
bh[0]='1';
flag1 = 0;
}
for (i=len-1;i>=0;i--) { //´Ó×îºóһλ¿ªÊ¼*2
if( (ah[i] - '0') * 2 >=10 ) {
s = (ah[i] - '0') * 2 %10+m;
bh[i+1] = s+'0';
m = 1;
}
else{
s = (ah[i] - '0') * 2 + m;
bh[i+1] = s+'0';
m = 0;
}
}
int flag = 1;
for (i=1;i<=len;i++) {
for (j=0;j<len;j++) {
if(ah[j] == bh[i]) {
ah[j] = 'a' ;
break;
}
}
}
for (i=1;i<len;i++) {
if(ah[i] != 'a') {
flag = 0;
break;
}
}
if (flag==0) {
printf("No\n");
}
else{
printf("Yes\n");
}
if(flag1==0) {
for(i=0;i<=len;i++){
printf("%c",bh[i]) ;
}

}
else{
for(i=1;i<=len;i++){
printf("%c",bh[i]) ;
}
}
return 0 ;
}

7-50 近似求PI(15 分)

本题要求编写程序,根据下式求π的近似值,直到最后一项小于给定精度eps。

2​π=1+31!+​3×5​2!+3×5×7​3!+⋯+​3×5×⋯×(2×i+1)​i!+⋯

输入格式:
输入在一行中给出精度eps,可以使用以下语句来读输入:

scanf(“%le”, &eps);
输出格式:
在一行内,按照以下格式输出π的近似值(保留小数点后5位):

PI = 近似值
输入样例:
1E-5
输出样例:
PI = 3.14158

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>  
int main()
{
double x;
double i = 2, d = 3;//i从第二项开始,d为第二项分母
double temp=1,n = 1, n1 = 2, sum = 1;
scanf("%lf", &x);
while (temp >= x)
{
temp = n / d;//每一项的单项
sum += temp;
n = n*n1;//分子
n1++;
d = d*(2 * i + 1);//分母
i++;
}
printf("%.6f\n", sum*2);
return 0;
}

7-51 求n以内最大的k个素数以及它们的和(20 分)

本题要求计算并输出不超过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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h> 
int sushu(int n); //定义一个函数判断输入n是否为素数,若是素数返回n,不是素数返回0;
int main() {
int n,k,sum = 0,i=0;
scanf("%d %d",&n,&k) ;
do {
if (sushu(n) != 0) //如果sushu(n)不返回0,说明n为素数
{
printf("%d",n);
i++;//计数,记录素数的个数
if (i < k && n > 2) //判断是否需要打印 + 号
{
printf("+");
}
sum = sum + n ;//求素数的合
}
n--;//n依次递减
} while(i<k&&n>0) ;//当已经求得的素数个数小于k个,并且n>0时继续循环
printf("=%d",sum) ; // \b去掉结尾多余的一个+号,输出素数和的结果
return 0 ;
}
int sushu(int n) {

int i = 2;
while(i<=n) {
if (n%i==0) {
break;
}
i++;
}
if (i==n) {
return n;
}
return 0;
}

7-52 数组元素循环右移问题(20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A
​0
​​ A
​1
​​ ⋯A
​N−1
​​ )变换为(A
​N−M
​​ ⋯A
​N−1
​​ A
​0
​​ A
​1
​​ ⋯A
​N−M−1
​​ )(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main() {
int n,m,i,g,q,ans,p;
scanf("%d %d",&n,&m) ;
int a[n-1] ;
for (i=0;i<=n-1;i++) {
scanf("%d",&a[i]) ;
}
for (p=1;p<=m;p++) {

for (q=n-1;q>0;q--) {
ans = a[q] ;
a[q] = a[q-1] ;
a[q-1] = ans ;

}
}
for (g=0;g<=n-1;g++){
printf("%d",a[g]) ;
if (g<n-1) {
printf(" ") ;
}
}
return 0;
}

7-53 求最大值及其下标(20 分)

本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。

输入格式:
输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。

输出格式:
在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

输入样例:
6
2 8 10 1 9 10
输出样例:
10 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main() {
int n,i;
scanf("%d",&n);
int a[n];
for (i=0;i<n;i++) {
scanf("%d",&a[i]) ;
}

int m;
int p = 0;
for(m=1;m<n;m++) {
if( a[m]>a[p] ) {
p = m;

}
}
printf("%d %d",a[p],p) ;

return 0 ;
}

7-54 将数组中的数逆序存放(20 分)

本题要求编写程序,将给定的n个整数存入数组中,将数组中的这n个数逆序存放,再按顺序输出数组中的元素。

输入格式:
输入在第一行中给出一个正整数n(1≤n≤10)。第二行输入n个整数,用空格分开。

输出格式:
在一行中输出这n个整数的处理结果,相邻数字中间用一个空格分开,行末不得有多余空格。

输入样例:
4
10 8 1 2
输出样例:
2 1 8 10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h> 
int main() {
int n,i;
scanf("%d",&n) ;
int a[n] , b[n];
int m , t ,x;
for(i=0;i<n;i++) {
scanf("%d",&a[i]) ;
}
m = n-1;
for (t=0;t<n;t++) {
b[t] = a[m] ;
m-- ;
}
for (x=0;x<n;x++) {
printf("%d",b[x]) ;
if(x<n-1) {
printf(" ");
}
}
return 0 ;
}

7-55 矩阵运算(20 分)

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出样例:
35

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
int main() {
int n;
scanf("%d",&n) ;
int a[n][n] ;
int i , j;
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
scanf ("%d",&a[i][j]) ;
}
}
int sum;
for (i=0;i<n;i++) {
for (j=0;j<n;j++) {
sum = sum + a[i][j] ;
}
} //计算所有元素的和
int x,y;
for(x=1;x<n;x++) {
sum = sum - a[n-1][x]; //所有元素的和减去最后一列的和,但不包括开始的端点
}
for(y=1;y<n-1;y++) {
sum = sum - a[y][n-1]; //所有元素的和减去最后一行的和,但不包括两个端点
}
int f=1;
int t;
for(t=0;t<n;t++) {
sum = sum - a[t][n-f] ;//所有元素的和减去最对角元素和
f++;
}

printf("%d",sum);

return 0 ;
}

7-56 找鞍点(20 分)

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1:
2 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
int main() {
int n;
scanf("%d",&n);
int a[n][n];
int i , j ;
for (i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}

for (i=0;i<n;i++){
int max = 0 , m = 0,t;
for(j=1;j<n;j++){
if (a[i][max] < a[i][j]) {
max = j; //寻找行最大值
}
}
for(t=0;t<n;t++) {
if (a[t][max] < a[m][max]) {
m = t; //寻找列最小值
}
}
if (a[m][max] == a[i][max]) { //如果一个数是行最大值同时又是列最小值,那么它就是鞍点

printf("%d %d",m,max) ;
return 0 ;

}
}
printf("NONE") ;
return 0 ;
}

7-57 查找整数(10 分)

本题要求从输入的N个整数中查找给定的X。如果找到,输出X的位置(从0开始数);如果没有找到,输出“Not Found”。

输入格式:
输入在第一行中给出两个正整数N(≤20)和X,第二行给出N个整数。数字均不超过长整型,其间以空格分隔。

输出格式:
在一行中输出X的位置,或者“Not Found”。

输入样例1:
5 7
3 5 7 1 9
输出样例1:
2
输入样例2:
5 7
3 5 8 1 9
输出样例2:
Not Found

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h> 
int main() {
int n,x;
scanf("%d %d",&n,&x) ;
int a[n] ,i;
for(i=0;i<n;i++) {
scanf("%d",&a[i]) ;
}
int y = -1;
for(i=0;i<n;i++) {
if(a[i]==x) {
y = i;
break;
}
}

if (y!= -1) {
printf("%d",y) ;
}
else {
printf("Not Found") ;
}

return 0 ;
}

7-58 求整数序列中出现次数最多的数(15 分)

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
int main() {
int n , i , j;
scanf("%d",&n) ;
int a[n] ,b[n];
for (i=0;i<n;i++) {
scanf("%d",&a[i]) ;
}

for (j=0;j<n;j++) {
int sum = 0;
for (i=0;i<n;i++) {
if(a[j]==a[i]) {
sum ++;
b[j] = sum ;
}
}
}
// for (i=0;i<n;i++) {
// printf("%d ",b[i]) ;
// }
int p = 0 ;
for (i=1;i<n;i++) {
if(b[i]>b[i-1]) {
p = i;
}
}
printf("%d %d",a[p] , b[p]) ;
return 0 ;
}

7-59 字符串逆序(15 分)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:
在一行中输出逆序后的字符串。

输入样例:
Hello World!
输出样例:
!dlroW olleH

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h> 
int main() {
char a[80] , b[80] ,ch;
int i ,j , cnt = 0;
for (i=0;ch != '\n';i++) {
ch = getchar() ;
a[i] = ch ;
cnt ++;

}
int m = cnt-2 ;
for (j=0;j<cnt;j++) {
b[j] = a[m] ;
m--;

}
printf("%s",b) ;
return 0;
}

7-60 删除重复字符(20 分)

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。

输出格式:
输出去重排序后的结果字符串。

输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h> 
#include <string.h>

int main() {
char ch[81],bh[81];
scanf("%s",ch) ;
int i,j,t=0;
for(i=0;i<strlen(ch);i++) {
int flag = 0;
for (j=i+1;j<strlen(ch);j++) {

if(ch[i] == ch[j]) {
flag = 1;
}
}
if(flag == 0) {
bh[t] = ch[i] ;
t++;
}

}
char dh;
for (i=0;i<t-1;i++) {
for (j=i+1;j<t-1;j++)
if( bh[i] > bh[j] ) {
dh = bh[i] ;
bh[i] = bh[j] ;
bh[j] = dh ;

}
}
for(i=0;i<strlen(bh);i++){
printf("%c", bh[i]) ;
}
return 0 ;
}

7-61 找最长的字符串(15 分)

本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。

输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式:
在一行中用以下格式输出最长的字符串:

The longest is: 最长的字符串
如果字符串的长度相同,则输出先输入的字符串。

输入样例:
5
li
wang
zhang
jin
xiang
输出样例:
The longest is: zhang

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d",&n) ;
char a[80] ;
char b[80] ;
int long1 = 0;
int i;
fflush(stdin);
for(i=1;i<=n;i++) {
gets(a) ;
if(strlen(a)>long1 ) {
long1 = strlen(a) ;
strcpy(b,a) ;
}
}
printf("The longest is: %s",b);
return 0;
}

7-62 切分表达式——写个tokenizer吧(20 分)

[先说点出题背景]

这个题是为低年级同学、学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂。如果是高年级、学过了正则表达式(Regular Expression)的同学或者学过了Java等OO语言的同学做这个题,应当发现这题比较简单吧。哦,对了,什么是tokenizer?请自行查询解决。反正在此处不应翻译成“令牌解析器”。

[正题]

四则运算表达式由运算数(必定包含数字,可能包含正或负符号、小数点)、运算符(包括+、-、*、/)以及小括号((和))组成,每个运算数、运算符和括号都是一个token(标记)。现在,对于给定的一个四则运算表达式,请把她的每个token切分出来。题目保证给定的表达式是正确的,不需要做有效性检查。

输入格式:
在一行中给出长度不超过40个字符的表达式,其中没有空格,仅由上文中token的字符组成

输出格式:
依次输出表达式中的tokens,每个token占一行。

输入样例:
32((2-2)+5)/(-15)
输出样例:
32
((2-2)+5)/(-15)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>
int main() {
char ch[40] ;
int i;
scanf("%s",&ch) ;
for (i=0;i<strlen(ch);i++) {
printf("%c",ch[i]) ;
if(ch[i+1] < '0' ||ch[i] <'0' ) {
if(ch[i+1]>'0'&&ch[i-1]=='('&&ch[i]=='-') {

}
else if(ch[i] == '.'||ch[i+1]=='.') {

}

else {
printf("\n") ;
}
}
}

return 0 ;
}

7-63 查验身份证(15 分)

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:
输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。

输入样例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h> 
int main() {
int weight[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2} ;
char m[] = "10X98765432";
int n , i , j;

scanf("%d",&n) ;

char number[n][19];

for (i=0;i<n;i++) {
scanf("%s",number[i]) ;
}

int flag = 1;

for(i=0;i<n;i++) {
int sum = 0;
for(j=0;j<17;j++) {
sum += (number[i][j]-'0') * weight[j] ;
}
int over = sum % 11 ;
if ( m[over] != number[i][17] ) {
flag = 0;
printf("%s\n",number[i]) ;
}
}
if (flag) {
printf("All passed") ;
}
return 0;
}

7-64 最长对称子串(25 分)

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:
输入在一行中给出长度不超过1000的非空字符串。

输出格式:
在一行中输出最长对称子串的长度。

输入样例:
Is PAT&TAP symmetric?
输出样例:
11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <string.h>
int main() {
char ch[10001] ;
gets(ch) ;
int len , i;
len = strlen(ch) ;
int max = 1;
for(i=1;i<len-1;i++) {
int x = i-1 , y = i+1 , ans = 1;
while (ch[x]==ch[y]&&x>=0&&y<=len) {
x--;
y++;
ans+=2;
}
if(ans>max) {
max = ans ;
}
}

for(i=1;i<len-1;i++) {
int x = i , y = i+1 , ans = 0;
while (ch[x]==ch[y]&&x>=0&&y<=len) {
x--;
y++;
ans+=2;
}
if(ans>max) {
max = ans ;
}
}
printf("%d",max) ;
return 0;
}

7-65 平面向量加法(15 分)

本题要求编写程序,计算两个二维平面向量的和向量。

输入格式:
输入在一行中按照“x1 y1 x2 y2”的格式给出两个二维平面向量v1=(x1 ,y1 )和v2 =(x2 ,y2 )的分量。
输出格式:
在一行中按照(x, y)的格式输出和向量,坐标输出小数点后一位(注意不能输出−0.0)。

输入样例:
3.5 -2.7 -13.9 8.7
输出样例:
(-10.4, 6.0)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>  
int main()
{
double x1,y1,x2,y2;
double x,y;
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
x=x1+x2;
y=y1+y2;
if(x < 0.05 && x > -0.05)
x = 0.0;
if(y < 0.05 && y > -0.05)
y = 0.0;
printf("(%.1f, %.1f)",x,y);
return 0;
}

7-66 找出总分最高的学生(15 分)

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

输入样例:
5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75
输出样例:
zhangfeng 10001 258

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h> 
#include <string.h>
struct xsxx {
char xh[6];
char xm[11];
int cj1;
int cj2;
int cj3;
};

struct jl {
char xm[11];
char xh[6];
int cj;
};
int main() {
struct xsxx a;
struct jl b;
int n,i;
scanf("%d",&n);
int sum = 0;
for(i=1;i<=n;i++) {
scanf("%s %s %d %d %d",a.xh,a.xm,&a.cj1,&a.cj2,&a.cj3) ;
if( b.cj<(a.cj1+a.cj2+a.cj3) ) {
b.cj = a.cj1+a.cj2+a.cj3 ;
strcpy(b.xm , a.xm) ;
strcpy(b.xh , a.xh) ;
}
}
printf("%s %s %d",b.xm,b.xh,b.cj) ;

return 0;
}

6-1 使用函数求素数和(20 分)

本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。

素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:
int prime( int p );
int PrimeSum( int m, int n );
其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数m≤n。

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <math.h>
int prime( int p );
int PrimeSum( int m, int n );

int main()
{
int m, n, p;

scanf("%d %d", &m, &n);
printf("Sum of ( ");
for( p=m; p<=n; p++ ) {
if( prime(p) != 0 )
printf("%d ", p);
}
printf(") = %d\n", PrimeSum(m, n));

return 0;
}
/* 你的代码将被嵌在这里 */

输入样例:
-1 10
输出样例:
Sum of ( 2 3 5 7 ) = 17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int prime( int p ){
int flag = 1;
int i;
if (p<2) {
flag = 0;
}
for (i=2;i<p;i++) {

if (p%i == 0) {
flag = 0;
break;
}
}
return flag;
}
int PrimeSum( int m, int n ){
int i,j;
int sum = 0 ;
for(i=m;i<=n;i++) {
int numb = 1;
if (i<2) {
numb = 0;
}
for(j=2;j<i;j++) {
if(i%j == 0) {
numb = 0;
break;
}
}
if(numb ==1) {
sum = sum + i;
}
}
return sum;
}

6-2 使用函数验证哥德巴赫猜想(20 分)

本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。

函数接口定义:
int prime( int p );
void Goldbach( int n );
其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <math.h>

int prime( int p );
void Goldbach( int n );

int main()
{
int m, n, i, cnt;

scanf("%d %d", &m, &n);
if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
if ( m < 6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(", ");
else printf("\n");
}

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:
89 100
输出样例:
89 is a prime number
90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79
100=3+97,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int prime( int p ){
int flag = 1;
int i;
if (p<2) {
flag = 0;
}
for (i=2;i<p;i++) {

if (p%i == 0) {
flag = 0;
break;
}
}
return flag;
}
void Goldbach( int n ){
int i,p,q;
for(i=2;i<n;i++) {
if(prime(i)) {
p = i;
}
q = n - p;
if(prime(q)) {
printf("%d=%d+%d",n,p,q) ;
break;
}
}
}

6-3 判断回文字符串(20 分)

本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。

函数接口定义:
bool palindrome( char s );
函数palindrome判断输入字符串char
s是否为回文。若是则返回true,否则返回false。

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
char s[MAXN];

scanf("%s", s);
if ( palindrome(s)==true )
printf("Yes\n");
else
printf("No\n");
printf("%s\n", s);

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:
thisistrueurtsisiht
输出样例1:
Yes
thisistrueurtsisiht
输入样例2:
thisisnottrue
输出样例2:
No
thisisnottrue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
bool palindrome( char *s ){
int i,j,num;
bool a = true;
if(strlen(s) ==1) {

}
else if(strlen(s)%2 != 0) {
num = (strlen(s)+1) / 2 - 1;
for(i=0;i<num;i++) {
if(s[i] != s[ (strlen(s)-1)-i] ) {
a = false;
break;
}
}
}
else {
num = (strlen(s) / 2) - 1 ;
for(i=0;i<=num;i++) {
if(s[i] != s[ (strlen(s)-1)-i] ) {
a = false;
break;
}
}
}
return a;
}

6-4 查找子串(20 分)

本题要求实现一个字符串查找的简单函数。

函数接口定义:
char search( char s, char *t );
函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。

裁判测试程序样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#define MAXS 30

char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */

int main()
{
char s[MAXS], t[MAXS], *pos;

ReadString(s);
ReadString(t);
pos = search(s, t);
if ( pos != NULL )
printf("%d\n", pos - s);
else
printf("-1\n");

return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:
The C Programming Language
ram
输出样例1:
10
输入样例2:
The C Programming Language
bored
输出样例2:
-1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string.h>

char *search( char *s, char *t ){
int i, j, k=0, slen, tlen;
char *p=NULL;
slen = strlen(s);
tlen = strlen(t);

for (i=0; i<slen; i++){
j=i;
while(s[j]==t[k]){
k++;
j++;
}
if(k>=tlen){
p = &s[i];
return p;
}
k=0;
}
return p;
}