第六课 循环

循环

while 语句

循环三要素:起点,终点,数据变化规律

for 与 while 的区别:从 structure 来说,for 比较严谨,while 比较自由

while 语句使用格式

1
2
3
4
5
6
7
表达式1
while (表达式2)
{
  sentence
  ...
  表达式3
}

break or continue

break:直接跳出循环,任意位置执行即直接跳出循环,无视后面的语句

continue:结束当次循环

1
2
3
4
5
6
7
8
9
// 求 1-10 奇数

int sum=0;
for (int i=1; i<=10; i++)
{
  if(i%2) continue;     // 如果是偶数就跳出本次循环
  sum+=i;          		  // 否则就相加求和
}
printf("%d",sum);

do…while

1
2
3
4
do{
  sentence;
  ...
}while(表达式1);  // first carry out 后判断

该语句至少要被执行一次,而 while 语句可能一次都不会执行

循环嵌套

1
2
3
4
5
6
7
8
9
// format
for (表达式123){
  sentence;
  ...
  for (表达式123){
     sentence;
     ...
   }
}

例题

  1. 斐波那契数列的前 20 项(a1=1; a2=1; an=an-1+an-2,n>=3),每行仅仅打印 5 个

if (i%5==0)printf('\n');

  1. 求两个数最大公约数/最小公倍数

    最大公约数:能同时整除这两个数的最大数 25 15 —— 5

    求解方法:辗转相除

    1
    2
    3
    4
    
    28 % 6 = 4 != 0
    6  % 4 = 2 != 0
    4  % 2 = 0
    // 此时 2 的值就是最大公约数
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    int m,n,r;
    int a=m,b=n;
    scanf("%d%*c%d",&m,&n);
    while(m%n!=0)
    {
      r = m%n;
      m = n;
      n = r;
    }
    printf("最大公约数=%d,最小公倍数=%d",na*b/n);
    

    最小公倍数:两个数的乘积除以最大公约数

    1
    2
    3
    4
    
    // 8和6 ,最大公约数 2
    6*8/2
      =48/2
      =24
    
  2. 不定次数的输入🍮,从键盘输入,以 0 结束,ask input of valve

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    int n,a,i=1;
    float aver;
    scanf("%d",&a);
    aver = a;
    while(n!=0)
    {
      scanf("%d",&n);
      aver += n;
      i++;
      printf("%f",aver/i);     // 注意这里似乎在输入结束后才会打印?
    }
    
  3. 从键盘输入字符以回车键结束,统计数字符号的个数

    1
    2
    3
    4
    5
    6
    7
    
    char n,
    int i=0;
    while((n=getchar())!='\n')
    {
      if(n>=48 && n<=57) i++;
    }
    printf("%d",i);
    
  4. 从键盘输入 n 求 1!+2!+3!+4!…+n!

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    int n,sum;
    int b;
    scanf("%d",&n);
    for (int i=1; i<=n; i++){
      b = 1;
      for (int j=1; j<=i; j++){
         b *= j;
       }
      sum += b;
    }
    printf("%d",sum);
    
  5. 输出 1-1000 之间完数,所有因子的和(不包括自身)等于该数

    1
    2
    3
    4
    5
    6
    7
    
    for (int i=1; i<1000; i++){      // 判断有效范围内数
      sum = 0;             					 // 因子之和
      for (int j=1; i<i; j++){      // 求因子
         if (i%j==0) sum+=j;  
       }
      if(sum==i) printf("%d",i);
    }
    
  6. 输出 50-100 之间的素数,即只能被1个自身整除

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    for(int i=50; i<=100; i++){
        int f = 0;                    // 设置机关
        for(int j=2;j<i; j++){        // sqrt(1) | i/2  | i-1
            if(i%j==0){
                f++;            
                break;
            }
         }
        if(f==0) printf("%d ",i);
    }
    
  7. 从键盘输入 m,k,输出比 m 大,但是最靠近 m 的 k 个素数

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    int m,k;
    printf("input m,k:");
    scanf("%d%*c%d",&m,&k);
    // 设置范围
    for (int i=m+1,j=1; j<=k; i++)
    {
        int f = 0;        // 无论在哪个位置被忘记初始化
        for (int n=2; n<i; n++)
        {
            if (i%n==0){
                f++;
                break;
            }
        }
        if(f==1){
            printf("%d ",i); 
            j++;vuvuvu
        }
        printf("\n");
    }
    
  8. 从键盘输入一个整数,求这个整数的各位之和,计算这个整数的位数

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    int number;
    scanf("%d",&number);
    int i=0;                      // 计数,是多少位
    int sum=0;                    // 各个位数求和
    while(number!=0)
    {
        i++;
        sum += number%10;
        number /= 10;
    }
    printf("%d-%d",sum,i);
    
  9. 图形输出(行/列),外循环控制行,内循环控制列

    1
    2
    3
    4
    5
    6
    7
    
    int i,j;
    for (i=1; i<=7; i++){
        for (j=1; j<i+1; j++){
            printf("*");
        }
        printf("\n");
    }
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    // 打印三角形
    int i,j;
    for (i=1; i<=6; i++){
        for (j=5; j>=i; j--){            // for (j=1; j<=6-i; j++)
            printf(" ");    
        }
        for (int k=1; k<=2*i-1; k++){
            printf("*");
        }
        printf("\n");    
    }
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    // 打印菱形
    #include <math.h>
    int i,j,k;
    for (i=-4; i<=4; i++){
    
        for (j=1; j<=abs(i); j++){
            printf(" ");
        }
        for (k=1; k<=9-2*abs(i); k++){
            printf("*");
        }
        printf("\n");
    }
    
Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy