第五章(循环应用)习题

it2023-07-19  68

第五章(循环应用)习题

5-1、阶乘

1.while循环

#include <stdio.h> int main() { int n; int i=1; int j=1; scanf("%d",&n); while(i <= n) { j *= i; i++; } printf("%d!=%d\n",n,j); return 0; }

2.for循环

#include <stdio.h> int main() { int n,i; int j=1; scanf("%d",&n); for(i=1; i<=n; i++){ j *= i; } printf("%d!=%d\n",n,j); return 0; }

5-2、素数

1.判断素数

#include <stdio.h> int main() { int x,i; int label = 1;//表示X为素数 scanf("%d",&x); for(i=2; i<x; i++) { if(x % i == 0) { label = 0; break;//continue } } if(label == 1) { printf("%d是素数",x); }else{ printf("%d不是素数",x); } return 0; }

2.输出100以内的素数

#include <stdio.h> int main() { int x,i; printf("100以内的素数:"); for(x=1; x<=100; x++) { int label = 1;//表示X为素数 for(i=2; i<x; i++) { if(x % i == 0) { label = 0; break;//continue } } if(label == 1) { printf("%d, ",x); } } return 0; }

3.输出前50个素数

#include <stdio.h> int main() { int x,i; int cnt=0; //累计素数个数 printf("前50个素数:\n"); for(x=1; cnt<50; x++) { int label = 1;//表示X为素数 for(i=2; i<x; i++) { if(x % i == 0) { label = 0; break;//continue } } if(label == 1) { cnt++; printf("%d\t",x);//\t:水平制表符,使输出的每列对齐 if( cnt %5 == 0)//输出每行5个 { printf("\n"); } } } return 0; }

5-3、凑硬币

question:

answer:

1.方法一:break跳出嵌套循环

#include <stdio.h> int main() { int x,one,two,five; int exit = 0; scanf("%d",&x); for(one=1; one<x*10; one++){ for(two=1; two<x*10/2; two++){ for(five=1; five<x*10/5; five++){ if(one + two*2 + five*5 == x*10){ printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x); exit = 1; break; } } if( exit ) break;//if(exit)等价于if(exit==1) } if( exit ) break; } return 0; }

2.方法二:goto跳出嵌套循环

#include <stdio.h> int main() { int x,one,two,five; scanf("%d",&x); for(one=1; one<x*10; one++){ for(two=1; two<x*10/2; two++){ for(five=1; five<x*10/5; five++){ if(one + two*2 + five*5 == x*10){ printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x); goto out;//!!!建议仅在多重循环中使用 } } } } out: return 0; }

5-4、前n项和

1.类型一:

question:

answer:

#include <stdio.h> int main() { int i,n; double sum = 0.0; scanf("%d",&n); for(i=1; i<=n; i++){ sum += 1.0/i; } printf("前%d项和为:%f\n",n,sum); return 0; }

2.类型二:

question:

answer:

#include <stdio.h> int main() { int i,n; double sum = 0.0; double sign = 1.0;//既表示符号,又做分母 scanf("%d",&n); for(i=1; i<=n; i++){ sum += sign/i;//注意分子和sum类型,int类型时‘/’运算符仅代表取整 sign = -sign;//每运算一次符号取反 } printf("前%d项和为:%f\n",n,sum); return 0; }

5-5、正序分解整数

question:

answer:

#include <stdio.h> int main() { int x; scanf("%d",&x); //计算输入的值的总位数 int mask = 1;//标记输入的值有几位数 int t = x;//临时存放输入值除以10的结果 while( t>9){ t /= 10; mask *= 10; } printf("x=%d, mask=%d\n", x, mask); //正序输出 do{ int d = x / mask; printf("%d",d); if(mask > 9){ printf(" "); } x %= mask; mask /= 10; }while( mask>0 ); printf("\n"); return 0; }

5-6、求最大公约数

question:

answer:方法一(枚举法)

#include <stdio.h> int main() { int a,b,min,i; int ret = 0; scanf("%d %d",&a,&b); if(a < b){ min = a; }else{ min = b; } for(i=1; i<min; i++){ if(a % i == 0){ if(b % i == 0){ ret = i; } } } printf("%d和%d的最大公约数是%d.\n",a,b,ret); return 0; }

answer:方法二(辗转相除法)

#include <stdio.h> int main() { int a,b,t; scanf("%d %d",&a,&b); while(b != 0) { t = a % b; a = b; b = t; } printf("最大公约数为:%d\n",a); return 0; }

5-7、求序列前N项和

question:

answer:

#include <stdio.h> int main() { int i,n; scanf("%d",&n); double l = 2;//分子//int类型的长度不够 double m = 1;//分母 double sum=0.0; double t; for(i=0; i<n; i++) { sum += l / m; t = l; l = l + m; m = t; } printf("%.2f",sum);//精确到小数点后两位 return 0; }

5-8、约分最简分式

question:

answer:

#include <stdio.h> int main() { int l;//分子 int m;//分母 scanf("%d/%d",&l,&m); int t; int a = l; int b = m; //求最大公约数 while(b > 0){ t = a % b; a = b;//最后一轮循环为最大公约数 b = t; } printf("%d/%d\n",l/a,m/a); return 0; }

5-9、念数字

question:

answer:

#include <stdio.h> int main() { int n; scanf("%d",&n); if(n < 0){ printf("fu "); n = -n; } int mask = 1; int t = n; //确定输入数的基数;三位数的基数为100,四位数的基数为1000 while(t > 9){ t /= 10; mask *= 10;//基数 } do{ int d = n / mask; switch(d){ 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(mask > 9){//每次输出空格隔开,最后一位输出不加空格 printf(" "); } n %= mask;//取剩余位 mask /= 10; }while(mask > 0); printf("\n"); return 0; }

5-10、求a的连续和

question:

answer:

#include <stdio.h> int main() { int a,n,i; scanf("%d %d",&a,&n); int sum = 0; int t = 0; //0*10+2 2*10+2 22*10+2 前*10+2 for(i=0; i<n; i++){ t = t*10 + a; sum += t; } printf("%d\n",sum); return 0; }
最新回复(0)