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

实验七 循环结构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;
}
// 每次把num[0],移至num[m-1]处;其他位置前移1位
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;
/*
while((x=getchar())!='\n' || x!=' '){ 这里使用getchar的方法,判断结束条件应该是 判断x = ’\n‘ 或者 EOF 来结束循环
if(x>='0'&& x<='9'){
count++;
}
}*/
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");
//-1 关 1 开
//从3开始检查每个灯的状态
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;
}