实验七 循环结构2 1. 数字滑滑梯2 说明 在学习编程的过程中,小 J 发现有一种求模运算的符号“%”,于是小 J 完成了一个让数字玩“滑滑梯”游戏的小程序。今天,小 J 想换个方向再来玩一把,例如输入:12345,则会依次输出:51234,45123,34512,23451,12345。
你也来写一个一起玩玩吧!
输入输出格式及样例 输入数据:
一个正整数 n(0<n<2^31 ),任何位上都不为 0,且每个数字只出现一次。
输出数据:
输出这个数字“滑滑梯”的结果,用一个空格隔开。
数据1
数据2
输入数据
6
573
输出数据
6
357 735 573
参考答案 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> #include <math.h> int main () { int i, j, n, k, nums[10 ], m=0 ; scanf ("%d" , &n); k = n; while (k>0 ){ k = k /10 ; m++; } k = n; for (i=m-1 ; i>=0 ; i--){ nums[i] = k % 10 ; k = k / 10 ; } for (i=0 ; i<m; i++){ int t = nums[m-1 ]; for (j=m-1 ; j>=0 ; j--){ nums[j+1 ] = nums[j]; } nums[0 ] = t; for (j=0 ; j<m; j++){ printf ("%d" , nums[j]); } printf (" " ); } return 0 ; }
2.含有7的素数 说明 小 J 昨天学习了素数,他觉得素数非常好玩,想找一找一些特殊的素数,因为他的幸运数字是 7,所以,他想知道在一个范围里,某一位上含有 7 的素数有哪些。你来告诉他吧!
输入输出格式及样例 输入数据:
输入两个整数m,n(0≤m≤n≤10^7 )
输出数据:
请按从小到大的顺序输出区间[m,n]内所有的某一位上包含 7 的素数。
如果这个区间内没有符合要求的素数,输出none
数据1
数据2
输入数据
1 20
20 30
输出数据
7 17
none
参考答案 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 #include <stdio.h> #include <math.h> int main () { int isPrime (int x) { if (x<2 ){ return 0 ; } if (x ==2 ){ return 1 ; } if (x%2 == 0 ){ return 0 ; } for (int i=3 ; i<= sqrt (x); i=i+2 ){ if (x%i==0 ){ return 0 ; } } return 1 ; } int k, n, m, flag=0 ; scanf ("%d%d" , &m, &n); for (; m<=n; m++){ if (isPrime(m)){ k = m; while (k>0 ){ if (k%10 ==7 ){ printf ("%d " , m); flag=1 ; break ; } k = k/10 ; } } } if (!flag){ printf ("none" ); } return 0 ; }
3. 统计数字字符个数 说明 输入一行字符,统计出其中数字字符的个数。
输入输出格式及样例 输入数据:
一行字符串,总长度不超过 255。
Peking University is set up at 1898.
输出数据:
4
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> int main () { int count=0 ; char x; for (int i = 0 ; i<255 ; i++){ x=getchar(); if (x>='0' && x<='9' ){ count++; } } printf ("%d" , count); return 0 ; }
4. 计算矩阵边缘元素之和 说明 输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入输出格式及样例 输入数据:
第一行分别为矩阵的行数 m 和列数 n(m<100, n<100),两者之间以一个空格分开;
接下来输入的m行数据中,每行包含n个整数(取值范围为 [0, 9]),整数之间以一个空格分开。
3 3
3 4 1
3 7 1
2 0 1
输出数据:
输出对应矩阵的边缘元素和。
15
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h> int main () { int sum=0 , m, n; scanf ("%d%d" , &m, &n); for (int i=1 ; i<=m; i++){ for (int j=1 ; j<=n; j++){ int t; scanf ("%d" , &t); if (i==1 || i==m || j==1 || j==n){ sum += t; } } } printf ("%d" , sum); return 0 ; }
5. 九九乘法表 说明 试编一个程序,输出如图所示的九九乘法表。
1 2 3 4 5 6 7 8 9 1*1= 1 2*1= 2 2*2= 4 3*1= 3 3*2= 6 3*3= 9 4*1= 4 4*2= 8 4*3=12 4*4=16 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
输入输出格式及样例 输入数据:
无
输出数据:
如上文所示的乘法表。注意等号右则的数据占2列右对齐,各公式格式间用1个空格隔开
参考答案 1 2 3 4 5 6 7 8 9 10 #include <stdio.h> int main () { for (int i=1 ; i<=9 ; i++){ for (int j=1 ; j<=i; j++){ printf ("%d*%d=%2d " ,i,j,i*j); } printf ("\n" ); } return 0 ; }
6. Fibonacci 数列 说明 Fibonacci数列的递推公式为:
Fn = Fn−1+Fn−2,其中 F1=F2=1。
当n比较大时,Fn 也非常大,现在我们想知道,Fn 除以10007的余数是多少。
输入输出格式及样例 输入数据:
输入包含一个整数 n(1≤n≤10^6 )。
输出数据:
输出一行,包含一个整数,表示Fn 除以10007的余数。
数据1
数据2
输入数据
10
22
输出数据
55
7704
提示 在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出 Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> int main () { int m; scanf ("%d" , &m); int f1=1 , f2=1 ; for (int i=3 ; i<=m; i++){ f2 = f1 + f2; f1 = f2 - f1; f2 = f2 % 10007 ; } printf ("%d" , f2); return 0 ; }
7. 求 Fibonacci 前 n 项和 说明 Fibonacci数列的递推公式为:
Fn=Fn−1+Fn−2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,F1 +F2 +⋯+Fn 的和除以10007的余数是多少。
输入输出格式及样例 输入数据:
输入包含一个整数 n(1≤n≤10^6 )。
输出数据:
输出一行,包含一个整数,表示F1+F2 +⋯+Fn 的和除以10007的余数。
数据1
数据2
输入数据
5
100
输出数据
12
1492
提示 n=5时,F1+F2+F3+F4+F5 =1+1+2+3+5=12。
参考答案 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 m, sum=2 ; scanf ("%d" , &m); int f1=1 , f2=1 ; if (m==1 ){ sum = 1 ; } if (m==2 ){ sum = 2 ; } for (int i=3 ; i<=m; i++){ f2 = f1 + f2; f1 = f2 - f1; sum += f2; sum = sum % 10007 ; f2 = f2 % 10007 ; } printf ("%d" , sum); return 0 ; }
8. 回文数 说明 1221 是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的 4 位十进制数。
输入输出格式及样例 输入数据:
无
输出数据:
按从小到大的顺序输出满足条件的 4 位十进制数。
1001
1111
1221
。。。
参考答案 1 2 3 4 5 6 7 8 9 #include <stdio.h> int main () { for (int i=1000 ; i<10000 ; i++){ if (i/1000 == i%10 && (i/100 )%10 == (i/10 )%10 ){ printf ("%d\n" , i); } } return 0 ; }
9. 求e的近似值 说明 自然常数e = 1/0! + 1/1! + 1/2! + 1/3! + ``` + 1/n! (0<= n <=50, 0! = 1)
给定一个正整数n,求出对应e的值,结果保留8位小数。
输入输出格式及样例 输入数据:
输入一个正整数n。
13
输出数据:
输出e的近似值
2.71828183
参考答案 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 m; double e; int jiecheng (int a) { int ji = 1 ; for (int i = 1 ; i<=a; i++){ ji = ji * i; } return ji; } scanf ("%d" , &m); for (int i =0 ; i<=m; i++){ e = e + 1.0 /jiecheng(i); if (i>=12 ){ break ; } } printf ("%.8f" , e); return 0 ; }
10.求两个正整数的最大公约数 说明 输入两个正整数a,b(1<a,b≤10^9 ),请输出它们的最大公约数。
输入输出格式及样例 输入数据:
两个正整数a,b(1<a,b≤10^9 )。
30 50
输出数据:
它们的最大公约数。
10
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> int main () { int a,b,r; scanf ("%d %d" , &a, &b); do { r = a%b; a = b; b = r; }while (r!=0 ); printf ("%d" , a); return 0 ; }
11. 进制转换 说明 任意给出一个数,将此数转换为 r 进制(1<r≤9)。
输入输出格式及样例 输入数据:
一行,两个整数n,r(n<10000)。
100 2
输出数据:
一行,一个整数,即题目的正确答案。
1100100
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> #include <math.h> int main () { int n,m,r; double sum=0 ; scanf ("%d %d" , &n, &r); m = n; for (int i=0 ; m>0 ; i++){ sum = sum + m % r * pow (10 , i); m = m / r; } printf ("%.f" , sum); return 0 ; }
12. 开关灯 说明 假设有N盏灯(N为不大于5000的正整数),从 1 到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从 1 到M依次编号。第一个人(1 号)将灯全部关闭,第二个人(2 号)将编号为 2 的倍数的灯打开,第三个人(3 号)将编号为 3 的倍数的灯做相反处理(即:将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和 3 号一样,将所有自己编号倍数的灯做相反处理。
请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。
输入输出格式及样例 输入数据:
输入正整数N和M,以单个空格隔开。
10 10
输出数据:
顺次输出关闭的灯的编号,其间用逗号间隔。
1,4,9
参考答案 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 n,m,flag; scanf ("%d%d" , &n, &m); printf ("1" ); for (int i=3 ; i<=n; i++){ if (i%2 ==0 ){ flag = 1 ; }else { flag = -1 ; } for (int j=3 ; j<=m; j++){ if (i%j==0 ){ flag = -flag; } } if (flag == -1 ){ printf (",%d" , i); } } return 0 ; }
13. 八进制转十进制 说明 把一个八进制数转变为十进制数。
输入输出格式及样例 输入数据:
一行,仅含一个八进制表示的正整数 n(1≤n≤10^9 )。
11
输出数据:
一个整数,表示对应的十进制数。
9
提示 转十进制: 11 = 1 * 8^1 + 1 * 8^0 = 9
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 #include <stdio.h> #include <math.h> int main () { int x,sum=0 ; scanf ("%d" , &x); for (int i=0 ; x>0 ;i++){ sum = sum + x%10 *pow (8 ,i); x = x/10 ; } printf ("%d" , sum); return 0 ; }
14. 短信计费 说明 用手机发短信,一条短信资费为 0.1元,但限定一条短信的内容在 70 个字以内(包括 70 个字)。如果一次所发送的短信超过了 70 个字,则会按照每 70 个字一条短信的限制把它分割成多条短信发送。假设已经知道某人当月所发送的短信的字数,试统计一下他当月短信的总资费。
输入输出格式及样例 输入数据:
第一行是整数 n(1≤n≤100),表示当月发送短信的总次数,接着 n 行每行一个整数(不超过 1000),表示每次短信的字数。
10
39
49
42
61
44
147
42
72
35
46
输出数据:
输出一行,当月短信总资费,单位为元,精确到小数点后 1 位。
1.3
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> #include <math.h> int main () { int x,y,count=0 ; scanf ("%d" , &x); for (int i=0 ; i<x ;i++){ int t; scanf ("%d" , &t); count = count + (t%70 == 0 ? t/70 : t/70 +1 ); } printf ("%.1f" , count * 0.1 ); return 0 ; }
15. 图形输出 说明 打印下面两种图形的其中一种:正方形、菱形。
输入输出格式及样例 输入数据:
第一行一个大写字母,表示输出图形的类型,’Z’表示正方形,’L’表示菱形;
第二行一个正整数x (1<=x<=100),表示输出图形的边长。
L
4
输出数据:
参考样例,输出相应的图形。
1 2 3 4 5 6 7 * *** ***** ******* ***** *** *
参考答案 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> #include <math.h> int main () { void printZ (int x) { for (int i=0 ; i<x; i++){ for (int j=0 ; j<x; j++){ printf ("*" ); } printf ("\n" ); } } void printL (int x) { int line = 1 ; while (line <= (2 *x - 1 )){ for (int i=0 ; i<fabs (x*1.0 -line);i++){ printf (" " ); } for (int j=0 ; j<(2 *x - 1 - 2 *fabs (x*1.0 -line));j++){ printf ("*" ); } printf ("\n" ); line++; } } char a; int b; scanf ("%c%d" , &a, &b); switch (a){ case 'Z' : printZ(b); break ; case 'L' : printL(b); break ; } return 0 ; }
16. 分解质因数(factor) 说明 输入一个正整数N(N>1),将它分解为质因数(质数即素数)。例如,输入90,输出90=233*5。
输入输出格式及样例 输入数据:
正整数N,(1<N<10^9)。
90
输出数据:
质因数相乘形式。
90=2*3*3*5
提示 注意:1不是N的质因数;若N为质数,N是N的质因数。
参考答案 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> #include <math.h> int main () { int i=2 ,x; scanf ("%d" , &x); printf ("%d=" , x); do { if (x%i==0 ){ printf ("%d*" , i); x = x/i; }else { i++; } }while (x!=i); printf ("%d\n" , x); return 0 ; }