零基础自学程序设计入门—C语言 第五周

1.循环控制

例:判断素数

#include <stdio.h>
int main()
{
    int x = 0;
    int i = 0;
    int isprime = 1;
    printf("请输入数字:");
    scanf_s("%d", &x);
    for (i = 2; i < x; i++) {
        if (x % i == 0) {
            isprime = 0;
            break;
        }
    }
    if (isprime == 0) {
        printf("不是素数");
    }
    else {
        printf("是素数");
    }
    return 0;
}

问:课程中提到有种“聪明”的做法,可以不设isPrime,直接利用循环出口处循环变量和终点值的关系来判断循环是否break了。你觉得这种做法好吗?

答:好处:节省内存坏处:不利于后期维护

2.多重循环

例:输出100以内的素数

#include <stdio.h>
int main()
{
    int i = 0;
    int t = 0;
    for (i = 2; i <= 100; i++) {
        int isprime = 1;
        for (t = 2; t < i; t++) {
            if (i % t == 0) {
                isprime = 0;
                break;
            }
        }
        if (isprime == 1) {
            printf("%d ", i);
        }
    }
    return 0;
}

例:输出50个素数

#include <stdio.h>
int main()
{
    int i = 0;
    int t = 0;
    int count = 0;
    for (i = 2; count<50; i++) {
        int isprime = 1;
        for (t = 2; t < i; t++) {
            if (i % t == 0) {
                isprime = 0;
                break;
            }
        }
        if (isprime == 1) {
            printf("%d ", i);
            count++;
        }
    }
    return 0;
}
    • 从嵌套的循环中跳出。

#include <stdio.h>
int main()
{
    int one = 0;
    int two = 0;
    int five = 0;
    for (one = 0; one <= 100; one++) {
        for (two = 0; two <= 50; two++) {
            for (five = 0; five <= 20; five++) {
                if (one + two * 2 + five * 5 == 100) {
                    printf("需要%d个一角,%d个两角,%d个五角\n",one,two,five);
                }
            }
        }
    }
    return 0;
}

break和continue只能跳出其所在的循环

1.goto out

#include <stdio.h>
int main()
{
    int one = 0;
    int two = 0;
    int five = 0;
    for (one = 0; one <= 100; one++) {
        for (two = 0; two <= 50; two++) {
            for (five = 0; five <= 20; five++) {
                if (one + two * 2 + five * 5 == 100) {
                    printf("需要%d个一角,%d个两角,%d个五角\n",one,two,five);
                    goto out;
                }
            }
        }
    }
out:
    return 0;
}

问:为什么课程中说goto的名声不好?用goto会怎么不好了?

答:破坏了代码的结构。

3.循环应用

例:前n项求和

#include <stdio.h>
int main()
{
    int x = 0;
    double i = 1;
    double sum = 0;
    printf("请输入数字:");
    scanf_s("%d", &x);
    for (i = 1; i <= x; i++) {
        sum += 1 / i;
    }
    printf("结果为%f", sum);
    return 0;
}
#include <stdio.h>
int main()
{
    int x = 0;
    double i = 1;
    double sum = 0;
    double sign = 1;
    printf("请输入数字:");
    scanf_s("%d", &x);
    for (i = 1; i <= x; i++) {
        sum += sign / i;
        sign = -sign;
    }
    printf("结果为%f", sum);
    return 0;
}

例:判断最大公约数

#include <stdio.h>
int main()
{
    int x = 0;
    int y = 0;
    int i = 0;
    int ret = 0;
    printf("请输入两个数字:");
    scanf_s("%d %d", &x, &y);
    for (i = 1; i < x && y; i++) {
        if (x % i ==0 && y % i == 0) {
            ret = i;
        }
    }
    printf("最大公约数是%d", ret);
    return 0;
}

辗转相除法

#include <stdio.h>
int main()
{
    int x = 0;
    int y = 0;
    int i = 1;
    int ret = 0;
    printf("请输入两个数字:");
    scanf_s("%d %d", &x, &y);
    if (x == 0 && y == 0) {
        printf("无最大公约数");
    }
    else if (y == 0) {
        printf("gcd=%d", x);
    }
    else if (x == 0) {
        printf("gcd=%d", y);
    }
    else {
        while (i != 0) {
            i = x % y;
            x = y;
            y = i;
        }
        printf("gcd=%d", x);
    }
    return 0;
}

例:整数分解

#include <stdio.h>
int main()
{
    int x = 0;
    int ten = 1;
    printf("请输入数字:");
    scanf_s("%d", &x);
    int t = x;
    while (t > 9) {
        t /= 10;
        ten *= 10;
    }
    do {
        int d = x / ten;
        printf("%d ", d);
        x %= ten;
        ten /= 10;
    } while (ten > 0);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值