实验三四中一些的题目难度较大或者易错点明显常见,在此列举重点题型。
(最难的几个题并没有在此篇展示,此篇为部分重点题。)
7-16 念数字
分数 10
作者 翁恺
单位 浙江大学
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此题虽然在循环部分出现,
但用数组做会降低很多难度,
那么在这,还是提供一种循环的做法。
#include <stdio.h>
int count(int x);
int main()
{
int n;
if(scanf("%d",&n)){};//输入要读的整数
int c;
if(n<0)
{
printf("fu ");
n=-n;
}//当输入的整数为负数时,取负数的相反数
c=count(n);
for(int i=0;c>0;i++)//循环的控制条件为c>0,之前写成了n>0
{
int m;
m=n/c;//取出该整数的第一位数字
n%=c;
switch (m)
{
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");
}
if(c>9)//判断点,控制最后输出没有空格
{
printf(" ");
}
c/=10;
}
return 0;
}
int count(int x)//例如-400,则返回值为100
{
int cnt=1;
while(x>9)
{
x/=10;
cnt*=10;
}
return cnt;
}
7-19 猜数字游戏
分数 15
作者 C课程组
单位 浙江大学
猜数字游戏是令游戏机随机产生一个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!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此题较为复杂,
要注意各种条件,只要将各种条件考虑清楚,
就可得出正确解法。
同时,嵌套是要仔细,
不要因为编译问题导致出错。
#include <stdio.h>
int main()
{
int i,a, b, N;
scanf("%d %d", &a, &N);
for(i = 1; i <= N; i++)
{
scanf("%d", &b);
if (b <= 0)
{
printf("Game Over");
return 0;
}
else if (b < a)
{
printf("Too small\n");
}
else if (b > a)
{
printf("Too big\n");
}
else if (a == b && i == 1)
{
printf("Bingo!");
return 0;
}
else if (a == b && i <= 3&&i!=1)
{
printf("Lucky You!");
return 0;
}
else if(a == b && i > 3)
{
printf("Good Guess!");
return 0;
}
else if(i == N && a != b)
{
printf("Game Over");
return 0;
}
}
printf("Game Over");
}
7-7 求Fibonacci(斐波那契)数列的n项和
分数 10
作者 张潇月
单位 临沂大学
已知斐波那契数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,……。本题要求编写程序,计算该数列的前n项和。
输入格式:
键盘输入n(2≤n≤40)。
输出格式:
sum=S,S为斐波那契数列的前n项和。
输入样例:
10
输出样例:
sum=143
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此题难度在本篇题解中难度最低,
记录此题的目的是要提醒一处细节,
在赋值时要注意是从左到右赋值还是从右到左,
给下一变量赋值时,注意位置。
#include <stdio.h>
int main()
{
int a1,a2,a3,n,i,s=0;
a1 = 1;
a2 = 1;
scanf("%d",&n);
for (i = 3; i <= n; i++)
{
a3 = a1 + a2;
s = s + a3;
a1 = a2;
a2 = a3;
}
printf("sum=%d",2+s);
return 0;
}
7-8 sdut-C语言实验- 简单计算
分数 12
作者 马新娟
单位 山东理工大学
接受从键盘输入的N个整数,输出其中的最大值、最小值和平均值(平均值为整除的商)。
输入格式:
第一行一个正整数N(N<=100);
第二行有N个用空格隔开的整数Ti (1 <= i <= N, 0 <= Ti <= 10000000)
输出格式:
三个有空格隔开的整数分别为最大值、最小值和平均值,其中平均值为整除的商。
输入样例:
在这里给出一组输入。例如:
5
1 2 3 5 4
输出样例:
在这里给出相应的输出。例如:
5 1 3
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此题难度不大,注意当i==1时,
对max和min的复制,然后在接下来的循环比较。
注意对sum的初始化赋值。
#include<stdio.h>
int main()
{
int sum=0, max,min,i,n,N;
scanf("%d",&N);
for(i=1;i<=N;i++)
{scanf("%d",&n);
if(i==1)
{
max=n;
min=n;
}
else if(i!=1)
{
if(n>max)
{
max=n;
}
if(n<min)
{
min=n;
}
}
sum=sum+n;
}
printf("%d %d %d",max,min,sum/N);
return 0;
}
7-9 sdut- C语言实验-判断素数(循环结构)
分数 15
作者 马新娟
单位 山东理工大学
从键盘上输入任意一个正整数,然后判断该数是否为素数。
如果是素数则输出"This is a prime."
否则输出“This is not a prime.”
输入格式:
输入任意一个正整数n(1 <= n <= 1000000)。
输出格式:
判断n是否为素数,并输出判断结果:
如果n是素数则输出"This is a prime."
否则输出“This is not a prime.”
特别提醒:请注意对1的判定,1不是素数。
输入样例:
3
输出样例:
在这里给出相应的输出。例如:
This is a prime.
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此篇题解共有三篇素数题,此题为铺垫,为最简单一类。
#include<stdio.h>
int main()
{
int i, n, a, t = 0;
scanf("%d", &n);
if (n <= 1)
{
printf("This is not a prime.");
}
else if (n > 1)
{
for (i = 1; i <= n; i++)
{
if (n % i == 0)
{
t++;
}
}
if (t == 2)
{
printf("This is a prime.");
}
else if (t != 2)
{
printf("This is not a prime.");
}
}
return 0;
}
7-15 sdut-C语言实验-完美的素数
分数 14
作者 马新娟
单位 山东理工大学
素数又称质数。指一个大于1的自然数,除了1和此整数自身外,不能被其他自然数整除的数。我们定义:如果一个素数是完美的素数,当且仅当它的每一位数字之和也是一个素数。现在给你一个正整数,你需要写个程序判断一下这个数按照上面的定义是不是一个完美的素数。
输入格式:
输入包含多组测试数据。
每组测试数据只包含一个正整数 n (1 < n <= 10^6)。
输出格式:
对于每组测试数据,如果 n 是完美的素数,输出“YES”,否则输出“NO”(输出均不含引号)。
输入样例:
在这里给出一组输入。例如:
11
13
输出样例:
在这里给出相应的输出。例如:
YES
NO
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
本题为判断完美素数,注意sum等值,
要在while语句里赋值,
在while前赋值会导致答案的错误,
因为sum在每一次while语句执行时都应该为初始值0;
#include<stdio.h>
int main()
{
int t,x,y,i,n,j,a,b,sum;
while(scanf("%d",&n)!=EOF)
{
t=n;
a=0;
b=0;
sum=0;
for(i=1;i<=n;i++)
{
if(n%i==0)
{
a++;
}
}
if(a==2)
{
while(t>0)
{
x=t%10;
t=t/10;
sum=sum+x;
}
for(j=1;j<=n;j++)
{
if(sum%j==0)
{
b++;
}
}
if(b==2)
printf("YES\n");
else
printf("NO\n");
}
else if(a!=2)
{
printf("NO\n");
}
}
return 0;
}
7-17 sdut-C语言实验-求某个范围内的所有素数
分数 12
作者 马新娟
单位 山东理工大学
求小于n的所有素数,按照每行10个显示出来。
输入格式:
输入整数n(n<10000)。
输出格式:
每行10个依次输出n以内(不包括n)的所有素数。如果一行有10个素数,每个素数后面都有一个空格,包括每行最后一个素数。
输入样例:
100
输出样例:
2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
本题较上题难度有所增加,
此题在每一次符合条件的循环过后都记一次数,
然后在计数达到10时换行即可。
#include <stdio.h>
int main()
{
int i, n, j,a=0;
scanf("%d",&n);
for (i = 2; i <= n; i++)
{
if (i == 2)
{
printf("%d ", i);
a++;
}
else
{
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
break;
}
}
if (j == i)
{
printf("%d ",i);
a++;
if (a % 10 == 0)
{
printf("\n");
}
}
}
}
return 0;
}
7-18 水仙花数
分数 20
作者 徐镜春
单位 浙江大学
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1
3
+5
3
+3
3
。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
代码长度限制
16 KB
时间限制
2500 ms
内存限制
64 MB
此题需要定义函数,如果调用库函数,可能导致运行超时(易错点)。
#include <stdio.h>
int pow(int m,int n)
{ int j,s=1;
for(j=1;j<=n;j++)
{
s=s*m;
}
return s;
}
int main()
{
int x,n,i,a,b;
scanf("%d",&n);
for(x=pow(10,n-1);x<pow(10,n);x++)
{
int b = x,sum=0;
for (i = 1; i <= n; i++)
{
a = b % 10;
b = b / 10;
sum = sum + pow(a, n);
}
if (sum == x)
{
printf("%d\n",x);
}
}
return 0;
}
7-21 打印九九口诀表
分数 15
作者 徐镜春
单位 浙江大学
下面是一个完整的下三角九九口诀表:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
16=6 26=12 36=18 46=24 56=30 66=36
17=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 99=81
本题要求对任意给定的一位正整数N,输出从11到N*N的部分口诀表。
输入格式:
输入在一行中给出一个正整数N(1≤N≤9)。
输出格式:
输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
输入样例:
4
输出样例:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此题看似复杂,实则为简单的循环嵌套,
要注意题目要求的输出格式
#include <stdio.h>
int main()
{
int n, i, j;
scanf("%d",&n);
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%-4d", j, i, j * i);
}
printf("\n");
}
return 0;
}
7-22 找完数
分数 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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
此题逻辑要清晰,对完数要有清晰的认识。注意flag的判断。
#include <stdio.h>
#include <math.h>
int main(void)
{
int s,j, m, n, i, x;
int flag = 0;
scanf("%d %d", &m, &n);
for (i = m; i <= n; i++)
{ s=0;
for (j = 1; j < i; j++)
{
if (i % j == 0)
{
s = s + j;
}
}
if (s == i)
{
flag = 1;
printf("%d = ", s);
for (x = 1; x < s; x++)
{
if (s % x == 0)
{
if (x == s / 2)
printf("%d", x);
else
printf("%d + ", x);
}
}
printf("\n");
}
}
if (flag == 0)
printf("None");
return 0;
}