5.2循环控制
素数
只能被1和自身整除的数,不包括1
break VS continue
- break:跳出循环
- continue:跳过循环这一轮剩下的语句进入下一轮
- 都只能对它所在的那层循环生效
嵌套的循环
- 意思:循环的里面还是循环
- 嵌套循环时的break只会跳出当前所在的循环,如果嵌套了多层循环就会被卡在下一层循环上而无法真正的跳出所有循环
100以内的素数
如何写程序输出100以内的素数?
#include <stdio.h> int main() { int x; //我们需要有一个循环,从 1 到 100 for(x=2; x<=100; x++){ int i; int isPrime = 1; // x是素数 for ( i=2; i<x; i++ ) { if ( x % i == 0 ) { isPrime = 0; break; } } //当它是素数的时候就输出出来,不是素数就不要输出任何东西了 if ( isPrime == 1 ) { printf("%d ", x); } } return 0; }
凑硬币
如何用1角、2角和5角的硬币凑出10元以下的金额?
#include <stdio.h> int main() { int x; int 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 == 1 ) break; } if ( exit == 1 ) break; } return 0; }
5.3循环应用
正序分解整数
- 输入一个非负整数,正序输出它的每一位数字
- 输入:13425
- 输出:1 3 4 2 5
分解整数输出(未解决结尾空格问题版本)
int x; scanf("%d",&x); do{ int d = x % 10; printf("%d",d); x /= 10; }while( x > 0); printf("\n"); //(未解决结尾空格问题版本) ----------------------------------------- int x; scanf("%d",&x); do{ int d = x % 10; printf("%d",d); if( x > 9){ printf(" "); } x /= 10; }while( x > 0); printf("\n"); ----------------------------------------------- (如果有一个mask的话) int x; scanf("%d",&x); x = 13425; int mask = 10000; do{ int d = x % 10; printf("%d",d); if( x > 9){ printf(" "); } x %= mask; mask /= 10; }while( mask > 0); printf("\n"); --------------------------------------------------- // (计算x的位数) x = 12345; int mask = 10000; int n = 0; do{ x /= 10; n++; }while( x > 0); printf("n = %d\n",n);
求最大公约数
- 输入两个数a和b,输出它们最大的公约数
- 输入:12,18
- 输出:6
- 枚举方法:过于麻烦,耗费较多资源
#include <stdio.h> int main() { int a,b; int min; scanf("%d %d", &a, &b); if ( a<b ) { min = a; } else { min = b; } int ret = 0; int i; 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; }
辗转相除法
- 如果b等于0,计算结束,a就是最大的公约数;
- 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
- 回到第一步
int a,b; int t; scanf("%d %d",&a,&b); int origa = a; int origb = b; while( b != 0 ){ t = a%b; a = b; b = t; } printf("%d和%d的最大公约数是%d",orida,origb,a);
第六周:数据类型
编程类型解析
//给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数 //输出格式:满足条件的3位数,要求从大到小,每行6个整数,整数间以空格分隔,但行末不能有多余空格 int main() { int a; scanf("%d",&a); int i,j,k; int cnt = 0; i = a; while( i<=a+3){ j = a; while( j<=a+3){ k = a; while( k<=a+3){ if( i!=j ){ if( i!=k ){ if( j!=k){ cnt++; printf("%d%d%d",i,j,k); if( cnt == 6){ printf("\n"); cnt = 0; }else{ printf(" "); } } } } k++; } j++; } i++; } return 0; } #include<stdio.h> int main() { int n; //scanf("%d", &n); n=3; int first = 1; int i = 1; while(i < n){ first *= 10; i++; } //printf("first=%d\n", first); //遍历100-999 i = first; while(i < first*10){ //需要一个临时的变量去记录 i int t = i; //需要一个"和"去记录每一位数的 n次幂 int sum = 0; do { int d = t % 10; t /= 10; //d^2 = d*d; d^3 = d*d*d; /* int p = 1; int j = 0; while(j < n){ p *= d; j++; } //或者*/ int p = d; int j = 1; while(j < n){ p *= d; j++; } sum += p; } while(t > 0); if (sum == i) { printf("%d\n", i); } i++; } return 0; } #include<stdio.h> int main() { int n; //scanf("%d", &n); n = 9; int i,j; i = 1; while( i <= n) { j = 1; while(j <= i){ printf("%d*%d=%d", j,i,i*j); //i,j会输出9*1= 9*2= //我们想要输出1*9= 2*9= //如果i*j小于10,比如1*1=1 小于 10 if( i*j < 10){ //输出三个空格 printf(" "); } else { //输出两个空格 printf(" "); } j++; } //还需要在每一个行加个回车 printf("\n"); i++; } return 0; } #include<stdio.h> int main() { int m,n; int i; //个数 int cnt = 0; int sum = 0; scanf("%d %d", &m, &n); //如果m是 1,单独做一个特殊的判断 if(m == 1) m=2; for(i=m; i<=n; i++){ int isPrime = 1; int k; //需要有另外一个循环去证明 i是不是isPrime for(k=2; k<i-1; k++){ if(i%k == 0){ isPrime = 0; break; } } // 判断 i 是否素数 if(isPrime) { cnt++; sum+=i; } } printf("%d %d\n", cnt, sum); return 0; } #include <stdio.h> int main(){ //随机数,猜测的最大次数 int number,n; //用户每次猜测的数字 int inp; // finished为 1 则表示猜中,0 没猜中 int finished = 0; // 记录猜测次数 int cnt = 0; scanf("%d %d",&number,&n); while(scanf("%d",&inp)){ cnt++; //如果这个数小于0 或 猜测次数大于最大猜测次数 ,则输入不合法 if(inp < 0 || cnt > n){ printf("Game Over\n"); break; } // 输入猜测数太大 if(inp > number){ printf("Too big\n"); // 输入猜测数太小 }else if(inp < number){ printf("Too small\n"); // 输入猜测数与随机数相等 }else{ // 1次成功 if(cnt == 1){ printf("Bingo!\n"); // 3次以内成功 }else if(cnt <= 3){ printf("Lucky You!\n"); // 3次以上成功 }else{ printf("Good Guess!\n"); } finished = 1; if(finished == 1) break; } } return 0; } #include<stdio.h> int main() { int n; //分子,分母 double dividend,divisor; double sum = 0.0; int i; double t; scanf("%d", &n); // n = 2000; dividend = 2; divisor = 1; for(i = 1; i <= n; i++){ sum += dividend/divisor; t = dividend; dividend = dividend + divisor; divisor = t; } printf("%.2f\n", sum); return 0; } #include<stdio.h> int main() { //分子,分母 int dividend,divisor; scanf("%d/%d", ÷nd, &divisor); int a = dividend; int b = divisor; int t; //辗转相除法算出最大公约数 while(b > 0){ t = a % b; a = b; b = t; } printf("%d/%d\n", dividend/a, divisor/a); return 0; } #include<stdio.h> int main() { int x; scanf("%d", &x); if(x < 0){ printf("fu "); x = -x; } int mask = 1; int t = x; //辗转相除法算出最大公约数 while(t > 9){ t /= 10; mask *= 10; } do{ int d = x / 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(" "); x %= mask; mask /= 10; } while(mask > 0); printf("\n"); return 0; } #include<stdio.h> int main() { int a,n; scanf("%d %d", &a, &n); int sum = 0; int i; //每一轮的数字 int t = 0; // 0*10+2 2*10+2 (2*10+2)*10+2 for(i=0; i<n; i++){ t = t*10+a; sum += t; } printf("%d\n", sum); return 0; }