循环控制

素数

只能被1和自己整除的数,不包括1 2, 3, 5, 7, 11, 13, 17, 19...

  1. int main()
  2. {
  3. int num;
  4. int flag = 1;
  5. printf("请输入数:");
  6. scanf("%d", &num);
  7. for (int i = 2; i < num; i++)
  8. {
  9. if (num % i == 0)
  10. {
  11. flag = 0;
  12. break; // 跳出循环
  13. }
  14. }
  15. if (flag == 0)
  16. {
  17. printf("不是素数");
  18. }
  19. else
  20. {
  21. printf("是素数");
  22. }
  23. }

breakcontinue

break:跳出循环 continue:跳过循环这一轮剩下的语句进入下一轮

多重循环

100以内的素数

如何写程序输出100以内的素数?

  1. int main()
  2. {
  3. for (int num = 2; num < 100; num++)
  4. {
  5. int flag = 1;
  6. for (int i = 2; i < num; i++)
  7. {
  8. if (num % i == 0)
  9. {
  10. flag = 0;
  11. break;
  12. }
  13. }
  14. if (flag == 1)
  15. {
  16. printf("%d,", num);
  17. }
  18. }
  19. return 0;
  20. }

嵌套的循环

循环里面还是循环

  1. int main()
  2. {
  3. int count = 0;
  4. // int num = 2;
  5. for (int num = 2; count < 50; num++)
  6. // while (count < 50) // 推荐while
  7. {
  8. int flag = 1;
  9. for (int i = 2; i < num; i++)
  10. {
  11. if (num % i == 0)
  12. {
  13. flag = 0;
  14. break;
  15. }
  16. }
  17. if (flag == 1)
  18. {
  19. printf("%d,", num);
  20. count++;
  21. }
  22. num++;
  23. }
  24. return 0;
  25. }

从嵌套的循环跳出:break只能跳出所在的循环

凑硬币

如何用1角、2角和5角的硬币凑出10元以下的金额呢?

breakcontinue

只能对它所在的那层循环做

接力break

image.png

goto

不推荐使用,使用会造成逻辑混乱,程序的线性结构被破坏,难以理解和阅读

  1. int day = 1;
  2. loop:
  3. if (day <= 31)
  4. {
  5. printf("%d\n", day);
  6. day++;
  7. goto loop;
  8. }

几道例题

  1. int sum = 0;
  2. for ( int i=0; i<10; i++ ) {
  3. if ( i%2 ) continue;
  4. sum += i;
  5. }
  6. printf("%d\n", sum);
  7. // 0+2+4+6+8 = 20
  1. int sum = 0;
  2. for ( int i=0; i<10; i++ ) {
  3. if ( i%2 ) break;
  4. sum += i;
  5. }
  6. printf("%d\n", sum);
  7. // 0

循环应用

第五周:循环控制 - 图3

int main()
{
    int num;
    double sum = 0.0;
    scanf("%d", &num);

    for (int i = 1; i <= num; i++)
    {
        sum += 1.0 / i;
    }
    printf("%f", sum);
    return 0;
}

// 交错相加
int main()
{
    int num;
    double sum = 0.0;
    int flag = 1;
    scanf("%d", &num);

    for (int i = 1; i <= num; i++)
    {
        sum += flag * 1.0 / i;
        flag = -flag;
    }
    printf("%f", sum);
    return 0;
}

// 趋于收敛

最大公约数

  • 输入两个数ab,输出它们的最大公约数
  • 输入:12 18
  • 输出:6

枚举法求最大公约数

int main()
{
    int a, b;
    int min;
    scanf("%d %d", &a, &b);

    if (a < b)
    {
        min = a;
    }
    else
    {
        min = b;
    }

    int convention = 0;

    for (int i = 1; i < min; i++)
    {
        if (a % i == 0)
        {
            if (b % i == 0)
            {
                convention = i;
                // break; // 最小公约数
            }
        }
    }
    printf("最大公约数为:%d", convention);
    return 0;
}

辗转相除法求最大公约数

辗转相除法

  1. 如果b等于0,计算结束,a就是最大公约数;
  2. 否则,计算a除以b的余数,让a等于b,而b等于那个余数;
  3. 回到第一步。

a b temp(a除以b的余数) 12 18 12 18 12 6 12 6 0 (6) 0 0

int main()
{
    int temp;
    int a, b;
    scanf("%d %d", &a, &b);

    while (b != 0)
    {
        temp = a % b;
        a = b;
        b = temp;
    }
    printf("MaxConvention = %d\n", a);
    return 0;
}

// 12 18
// a=18, b=12, temp=12
// a=12, b=6, temp=6
// a=6, b=0, temp=0
// MaxConvention = 6

正序分解整数

  • 输入一个非负整数,正序输出它的每一位数字
  • 输入:13425
  • 输出:1 3 4 2 5
int main()
{
    int num;
    int figure;
    int length;
    printf("Please enter the num:");
    scanf("%d", &num);
    length = fnGetLength(num);
    printf("数字序列长度为:%d\n", fnGetLength(num));
    printf("The figures sequence is:");

    for (int i = length; i > 0; i--)
    {
        int protype = 10;
        for (int j = 1; j < i - 1; j++)
        {
            protype *= 10;
        }
        if (i != 1)
        {
            figure = num / protype;
        }
        else
        {
            figure = num % protype;
        }
        printf("%d ", figure);
        num = num % protype;
    }
}

// Please enter the num:987654321
// 数字序列长度为:9
// The figures sequence is:9 8 7 6 5 4 3 2 1