C语言程序设计实验课参考答案(实验六:循环结构1)

实验六 循环结构1

1. 多位整数逆转

说明

给定一个多位数n(n<10^9),请输出其各位数字逆转后的整数,输出要求去掉前导0

输入输出格式及样例

输入数据(一个正整数):

输出数据(逆转后的各位数字结果,去掉前导0)

参考答案

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(){
int x, sum = 0;
scanf("%d", &x);
while(x>0){
sum = sum * 10 + x % 10; //每次将sum*10加上新的个位数,组成新的多位数
x = x / 10;//每次提取个位数之后,将个位数删除,供下次循环使用
}
printf("%d", sum);
return 0;
}

2.计算总分

说明

期末考试终于结束了!数学老师在统计全班数学总分,因为人数比较多,他觉得这件事情交给计算机来做比较方便。你能帮老师解决这个问题吗?

输入输出格式及样例

输入数据(输入两行, 第一行为整数n(1≤n<100),表示参加这次考试的人数; 第二行是这n个学生的成绩,相邻两个数之间用单个空格隔开。所有成绩均为 0 到 100 之间的整数。)

5

85 78 90 99 60

输出数据(输出一个整数,即全班数学总分)

412

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main(){
int i, num, sum=0;
scanf("%d", &num);
//通过输入的num,确定for循环执行的次数,每次将读取到的成绩累加到总和上
for(i=0; i<num; i++){
int t;
scanf("%d", &t);
sum += t;
}
printf("%d", sum);
}

3. 输出满足条件的数

说明

请按顺序输出 n 个数中,能够同时被6 和 10 整除的数。

输入输出格式及样例

输入数据(第一行输入一个正整数 n(1<n≤1000)。 第二行连续输入n 个整数,均在int 型范围内。):

5

2 60 7 30 9

输出数据(按输入顺序依次输出可以同时被6 和10 整除的数,并用一个空格隔开):

60 30

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(){
int i, n;
scanf("%d", &n);
//通过for循环读取输入的每个数,
for(i=0; i<n; i++){
int t;
scanf("%d", &t);
//判断是否符合条件,符合就输出
if(t%6==0 && t%10==0){
printf("%d ", t);
}
}
}

4. 偶数求和

说明

输入 n 个整数,求出其中所有偶数的和。

输入输出格式及样例

输入数据(输入第一行一个一个整数 n(1≤n≤10^5 ) 表示数的个数。接下来一行 n 个 int 范围内的整数。):

5

1 4 2 7 8

输出数据(一个整数,表示这些数的和):

14

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
int main(){
int i, num, sum=0;
scanf("%d", &num);
//通过for循环读取输入的每个数,
for(i=0; i<num; i++){
int t;
scanf("%d", &t);
//判断是否符合条件,符合就执行累加
if(t%2==0){
sum += t;
}
}
printf("%d", sum);
}

5. 求平均年龄

说明

班上有学生若干名,给出每名学生的年龄(整数),求班上所有学生的平均年龄,保留到小数点后两位。

输入输出格式及样例

输入数据(第一行有一个整数n(1≤n≤100),表示学生的人数。其后n行每行有1个整数,表示每个学生的年龄,取值为15到25。):

2

18

17

输出数据(输出一行,该行包含一个浮点数,为要求的平均年龄,保留到小数点后两位。):

17.50

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main(){
int i, num, sum=0;
scanf("%d", &num);
//通过for循环读取输入的每个数,
for(i=0; i<num; i++){
int t;
scanf("%d", &t);
sum += t;//将读取到的年龄累加
}
printf("%.2f", sum*1.0/num);//输出时求平均年龄,注意整形需要转化成double再执行除法
}

6. 区间和

说明

输入两个正整数s,t(−10^4 ≤s≤t≤10^4 ),请求出s+(s+1)+(s+2)+⋯+t 的和。

输入输出格式及样例

数据1 数据2
输入数据(两个整数s,t) 1 5 -10 10
输出数据(输出和) 15 0

参考答案

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(){
int i,s,t,sum=0;
scanf("%d%d", &s, &t);
for(i=0; s + i<=t; i++){//也可以是从s开始,每次s+1,直到s<=t,可以不用定义变量i
sum += s + i;
}
printf("%d", sum);
}

7. 三角形

说明

最近小明在书上看到如下图的直角三角形,小明想用代码打印出来,但他不会,你能帮帮他吗?

1
2
3
4
*
**
***
···

输入输出格式及样例

输入数据(给定一个n,代表要画出n行的直角三角形,(0<n≤30)):

4

输出数据(若该生恰好有一门课不及格,输出1;否则输出0):

*

**

***

****

思路

不确定行数,我们要用循环输出每一行

不确定列数,我们要用循环输出一行中的每一列

本题需要两层循环嵌套,输出应该逐行输出,所以外层循环表示行,内层循环表示列

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main(){
int i,j,n;
scanf("%d", &n);
//双层循环,i控制行数,j控制列数
for(i=1; i<=n; i++){
for(j=1; j<=i; j++){
printf("*");
}
printf("\n");
}
return 0;
}

8. 和为k的数

说明

输入三个整数 n,m,k(1≤n<m≤1000000,1≤k≤50),请你从小到大输出区间[n,m] 里所有位之和恰好等于k 的整数。

输入输出格式及样例

输入数据(三个正整数n,m,k,含义如上)

输出数据(若干个符合条件的整数,中间用一个空格隔开;如果没有符合条件的整数,则输出 none)

数据1 数据2 数据3
输入 2 20 5 30 50 7 30 50 2
输出 5 14 34 43 none

参考答案

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,m,k,count=0;
scanf("%d%d%d", &n, &m, &k);
for(; n<=m; n++){
int t = n, sum = 0;
while(t>0){
sum += (t % 10);//提取每次的个位数,累加
t = t / 10;//去除个位数,
}
if(sum == k){//符合条件就输出,计数器+1
printf("%d ", n);
count++;
}
}
if(count == 0){//通过计数器的值,判断前面是否有符合条件的已输出,
printf("none");
}
return 0;
}

9. 小 J 的命运

说明

“分分分,学生的命根……”,小 J 对此深有体会!

每次考试成绩出来,只要比上一次考的分数高,小 J 就会受到妈妈的表扬,奖励一瓶“涨芝士”酸奶;相反,如果比上次分数低,则会受到“热烈的鞭笞”,奖励“爱の爆肉”一份!而如果分数与上次相同,则平安无事!

其实,小 J 的水平基本上变化不大,但是每次试卷的难度却参差不齐,分高分低完全取决于试卷的难度系数。难度系数较高的试卷,小 J 考的分数一定较低,相同难度系数时,分数也相同。

现在,班主任李老师已经将本学期要测试的试卷准备好了,请你通过试卷难度系数,分析一下小 J 在本学期即将挨揍的次数,以及受到表扬的次数。

每学期的第一场测试,无论成绩如何,都既不会受表扬,也不会挨揍。

输入输出格式及样例

输入数据(第一行一个正整数n(0<n≤1000),第二行连续 x(0<x≤100),按顺序表示每次测试的难度系数。):

输出数据(一行,包含 2 个整数,分别表示小 J 挨揍的次数,与受表扬的次数,中间用一个空格隔开。):

数据1 数据2
输入 5
1 2 3 4 5
5
5 3 4 1 2
输出 4 0 2 2

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
int main(){
int i, n, a, x=0, y=0;
scanf("%d", &n);//读取考试次数,用来控制循环次数
scanf("%d", &a);//for循环之前读取第一次的考试难度,第一次不需要比较,所以提前读取出来
for(i=1; i<n; i++){//for循环减少一次,从第二个数开始
int b;
scanf("%d", &b);
//判断当前考试难度b与上一次难度a的大小,
if(a<b){
x++;
}else if(a>b){
y++;
}
a = b;//循环结束前,将本次考试难度赋值给a,供下次循环比较使用
}
printf("%d %d", x, y);
}

10.病毒检测

说明

目前科学家都在紧张忙碌地进行新冠病毒分离检测,我们如何识别一个病毒呢?C国发现一种病毒的特征,它会隐藏在一个基因序列中,如果在序列中发现连续的5个递增的数,都既是 6 的倍数,又是 10 的倍数,那么这个基因中就检测出了X1Y1病毒!

聪明机智的你,请运用 C/C++ 或 Python 语言的 for循环,来帮助科学家们完成这项急迫艰巨的工作吧!

输入输出格式及样例

输入数据(第一行,输入一个正整数n,为基因序列的长度。(小于等于 1000),连续输入n个整数,为基因序列的数字。(小于 1000 的非负整数)):

输出数据(如果存在病毒,第一行输出 Yes,第二行一个整数,为该病毒的第一个数在序列中的位置;如果不存在病毒,直接输出 No):

数据1 数据2
输入 8
1 2 3 4 5 6 7 8
10
1 4 6 0 60 90 120 150 9 10
输出 No Yes
4

参考答案

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, n, a=-1, count=0, x=1;//初始状态 a=-1肯定小于第一个数方便在循环执行判断,x为初始的病毒位置
scanf("%d", &n);
for(i=0; i<n; i++){
int b;
scanf("%d", &b);
if(a<b && b%6==0 && b%10==0){//判断3个条件同时符合,计数器+1
count++;
if(count==5){//计数器到5时,输出结果
printf("Yes\n%d", x);
return 0;
}
}else{//只要不满足条件,就将计数器和病毒位置重置
x = i+1;//让病毒位置从下一位开始
count=0;//计数器清零
}
a = b;//每次将当前的值复制给a,用于下一次比较大小
}
printf("No");
return 0;
}

11. 整数的位数

说明

输入一个整数n(0≤n≤10^6 ),请求出它是几位数

输入输出格式及样例

输入数据(正整数n):

输出数据(n 的位数):

数据1 数据2
输入 123 5001
输出 3 4

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main(){
int n, count=0;
scanf("%d", &n);
if(n==0){//首先排除n=0的情况
count = 1;
}
while(n>0){//大于0的数通过循环,
n = n / 10;
count++;
}
printf("%d", count);
return 0;
}

12. 数字滑滑梯

说明

在学习编程的过程中,小 J 发现有一种求模运算的符号“%”,于是小 J 想到了一个让数字玩“滑滑梯”游戏的小程序。

例如输入:12345,则会依次输出:12345,23451,34512,45123,51234。

你也来写一个一起玩玩吧!

输入输出格式及样例

输入数据(一个正整数 n(0<n<2^31 ),任何位上都不为 0):

输出数据(输出这个数字“滑滑梯”的结果,每行输出一个):

数据1 数据2
输入 5 123
输出 5 123
231
312

思路

123⇒23×10+123÷100⇒230+1⇒231。

其中 100 表示 123 的最高位是百位,那么,如何得到n 的最高位呢?

测试用例中有较大的数,2147483648,在执行位置调换时,会产生超过int取值范围的数,建议用数组进行处理。

参考答案

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 i, j, n, k, nums[10], m=0;
scanf("%d", &n);
//1.获取数字位数
k = n;
while(k>0){
k = k /10;
m++;
}
//2.读取每个位置上的数字,放到数组中,倒过来,还是按照数字的顺序
k = n;
for(i=m-1; i>=0; i--){
nums[i] = k % 10;
k = k / 10;
}
//3.从数组输出第一个拼接的数 (原数未调整顺序)
for(i=0; i<m; i++){
printf("%d", nums[i]);
}
printf("\n");
//4.每次把num[0],移至num[m-1]处;其他位置前移1位
for(i=0; i<m-1; i++){
int t = nums[0];
for(j=0; j<m-1; j++){
nums[j] = nums[j+1];
}
nums[j] = t;
for(j=0; j<m; j++){
printf("%d", nums[j]);
}
printf("\n");
}
return 0;
}

13. 判断素数

说明

输入一个整数 n,请你判断n 是否为素数。

输入输出格式及样例

输入数据(如果n 为素数,则输出 YES;否则输出 NO。):

输出数据(输出为一行,如果晶晶可以接受贝贝的邀请,输出”YES”;否则,输出”NO”):

数据1 数据2
输入 0 5
输出 NO YES

思路

所有小于 2 的数,以及大于 2 的偶数,都不是素数;

2 是素数;

除了 2 以外,所有的素数都是奇数;

如果一个数不是素数,它的大于 1 的因数中,最小的因数的平方,一定不大于它自己。 例如:4 的最小不是 1 的因数为
2 ≤4;同样,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
#include<stdio.h>
#include<math.h>
int main() {
int i, flag, number;
scanf("%d", &number);
flag = 1;
//这里没有按照题目给的思路来写,,,,参照书上也有判断素数的代码
if(number == 2){
flag = 1;
}
else if(number < 2 || number % 2 == 0){
flag = 0;
}else{
for (i = 2; i <= sqrt(number); i++){
if (number % i == 0){
flag = 0;
break;
}
}
}
if (flag)
printf("YES");
else
printf("NO");
return 0;
}

14. 寻找素数

说明

输入两个整数m,n(0≤m≤n≤10^7 ),请输出区间[m,n]内所有的素数。

输入输出格式及样例

输入数据(两个整数m,n(0≤m≤n≤10^7 ))
输出数据(从小到大输出区间[m,n]内所有的素数。如果这个区间内没有素数,输出none)

数据1 数据2 数据3 数据4
输入 1 10 5 20 8 10 0 1
输出 2 3 5 7 5 7 11 13 17 19 none none

提示

用例中,有个0-1000000的区间,执行会超时,参考上一题的思路,将明确不是素数的情况先排除掉,再进行循环

参考答案

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>
#include<math.h>
int main() {
//定义一个判断素数的函数
int prime(int x) {
if(x<2){
return 0;
}
if(x==2){
return 1;
}
if(x%2==0){
return 0;
}
//先将前面确定不是素数的情况排除,再进行循环,每次+2,只需要判断奇数
int i;
for (i = 3; i <= sqrt(x); i = i + 2) {
if (x % i == 0) {
return 0;
}
}
return 1;
}
int j, m, n, flag = 0;
scanf("%d%d", &m, &n);
for (j = m; j <= n; j++) {
if(prime(j)){//调用判断素数的函数
printf("%d ", j);
if(flag == 0){
flag = 1;
}
}
}
if (flag == 0) {
printf("none");
}
return 0;
}

15. 求阶乘

说明

利用for循环求n!的值。

提示,n!=1×2×…×n。

输入输出格式及样例

输入数据(输入一个正整数n,对于所有数据,1≤n≤20):
4
输出数据(输出n!的值):
24

思路

n>12时,n!将超出int的取值范围,所以使用double来存储这个阶乘的值,输出时%.f隐藏小数部分

参考答案

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(){
int i, n;
double ji=1.0;//考虑取值范围,将ji定义成double类型
scanf("%d", &n);
for(i=1; i<=n; i++){
ji = ji * i;
}
printf("%.f", ji);
return 0;
}

16. 求小数的某一位

说明

分数a/b化为小数后,小数点后第n位的数字是多少?

输入输出格式及样例

输入数据(三个正整数a,b,n,相邻两个数之间用单个空格隔开。0<a<b<100,1≤n≤10000。):

1 2 1

输出数据(一个数字):

5

思路

用例中,有个取154位小数位数字的,double小数的有效位只有6位,先除再取是取不到的。

从数学除法竖式的计算方式,每次不能整除时,用余数*10再除,得到商,来求得对应数位上的数字

参考答案

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
int main(){
int a, b, n, i, r;
double c;
scanf("%d%d%d", &a, &b, &n);
r = a % b;
//通过for循环,每次将余数r*10再除b得到新的余数,进行下次循环,循环n-1次,第n次求商,在for循环后
for(i=0; i<n-1; i++){
r = r * 10 % b;
}
printf("%d", r*10/b);//求商即要得到的数
return 0;
}