MOOC 翁恺 C语言笔记(二)

这篇博客介绍了多种循环结构的使用,包括while、do-while和for循环,用于计算阶乘、判断素数以及整数分解。还探讨了如何优化算法,例如通过求对数简化计算和使用循环控制技巧。此外,还展示了如何通过循环实现整数逆序输出和求平均数的功能。
摘要由CSDN通过智能技术生成

5月7日

p33 循环

  • 输入一串数字,输出这串数字一共有多少位数
int main() {
    int a;
    int n = 0;
    printf("input a number:");
    scanf("%d", &a);

    while (a > 0) {
        n++;
        a /= 10;
    }
    printf("%d", n);
}

不用循环也可以做到,对其求以10为底的对数,然后取整数部分再加1,就是这个整数的位数

#include<stdio.h>
#include<math.h>
void main()
{
	int n;
	scanf("%d",&n);
	printf("%d的位数是%d\n",n,(int)log10(n)+1);   //注意int
}

p34 while循环

  • do-while循环:先进循环体,再判断是否满足循环条件

    do{
        <循环体语句>
    } while (<循环条件>);   
    
    void main() {
        int x, n = 0;
        printf("input x: ");
        scanf("%d", &x);
        
        do {
            n++;
            x /= 10;
        } while (x > 0);
        printf("%d位数", n);
        
    }
    

p35 do-while循环

  • 验证
    • 测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等
    • 个位数
    • 10
    • 0
    • 负数

p36 循环计算

  • 计算 l o g 2 X log_2 X log2X

    • 为什么ret从0开始?
    • 要兼顾循环条件x>1
    • 为什么循环条件是 x>1 ?
    • 因为 l o g 2 1 = 0 log_2 1 = 0 log21=0,所以不希望x=1进入while循环,即可直接输出0
int main() {
int x;
int ret = 0;
printf("input a number:");
scanf("%d", &x);
int temp = x;

while (x > 1) {
x /= 2;
ret++;
}
printf("log2 of %d is %d", temp, ret);
}

p37 猜数游戏

  • 让计算机来想一个数,然后让用户来猜,用户每输入一个数,就告诉他是大了还是小了,直到用户猜中为止,最后还要告诉用户他猜了几次。
#include <stdio.h>
#include <stdlib.h>
#include<time.h>

int main() {
int input = 0;
int count = 0;
srand((unsigned int) time(NULL));//每次运行可以生成不同的随机数
int ret = rand() % 100 + 1;//产生一个1到100的随机数

do {
printf("please input a number:");
scanf("%d", &input);
count++;

if (input < ret) {
printf("\n你猜错了!再大一点!\n");
} else if (input > ret) {
printf("\n你猜错了!再小一点!");
}
} while (input != ret);

printf("\n你猜对了!\n答案是:%d,你猜了%d次", ret, count);
}

p38 算平均数

  • 让用户输入一系列的正整数,最后输入-1表示输入结束,然后程序计算出这些数字的平均数,输出输入数字的个数和平均数。

    s u m = ∑ i = 1 n x i n sum = \frac{\sum_{i=1}^nx_i}{n} sum=ni=1nxi

int main() {
int sum = 0;
int count = 0;
int temp = 0;

do {
printf("如果想要终止输入,请输入\"-1\"。输入整数:");
scanf("%d", &temp);
sum += temp;
count++;
} while (temp != -1);

double result = (1.0 * (sum + 1))/ (count - 1);
printf("the result is %.2lf", result);
}

p39 整数逆序

  • 整数的分解:一个整数由1至多位数字组成,如何分解出整数各个位上的数字,然后加以计算。
int main() {
    int x;
    int digit;
    int ret = 0;

    printf("input a number:");
    scanf("%d", &x);

    while (x > 0) {
        digit = x % 10;//最后一位数
        ret = ret * 10 + digit;
        printf("x = %d,digit = %d,ret = %d\n", x, digit, ret);
        x /= 10;
    }
}

/*example:
input a number:1160
x = 1160,digit = 0,ret = 0
x = 116,digit = 6,ret = 6
x = 11,digit = 1,ret = 61
x = 1,digit = 1,ret = 611
*/

5月8日

p40 for循环

  • 计算阶乘
  • 对于一开始的i=1,当i <= x时,重复做循环体,每一轮循环在做完循环体内的语句后,使得i=i+1
int main() {
    int x;
    int y = 1;
    printf("input:");
    scanf("%d", &x);

    for (int i = 1; i <= x; i++) {
        y *= i;
    }
    printf("%d! = %d", x, y);
}

p42 循环的控制

  • 判断素数
    • break:跳出循环
    • continue:跳过循环这一轮剩下的语句,进入下一轮
int main() {
    int x;
    int temp = 0;
    printf("input:");
    scanf("%d", &x);

    for (int i = 2; i < x; i++) {
        if (x % i == 0) {
            temp = 1;
            break;
        }
    }

    if (temp == 0) {
        printf("%d是素数!", x);
    } else {
        printf("%d不是素数!", x);
    }
}

p43 嵌套的循环

  • 输出100以内的素数
int main() {
    int max = 0;
    printf("input maximum:");
    scanf("%d", &max);
    for (int i = 2; i <= max; i++) {
        int temp = 0;
        for (int j = 2; j < i; ++j) {
            if (i % j == 0) {
                temp = 1;
                break;
            }
        }
        if (temp == 0) {
            printf("%d ", i);
        }
    }
}
  • 输出指定个数的素数
int main() {
    int max = 0;//素数的个数
    int cnt = 0;
    int x = 2;
    printf("input maximum:");
    scanf("%d", &max);
//    for (int i = 2; i <= max; i++) {
    while (cnt < max) {
        int temp = 0;
        for (int j = 2; j < x; ++j) {
            if (x % j == 0) {
                temp = 1;
                break;
            }
        }
        if (temp == 0) {
            cnt++;
            printf("%d\t", x);
            if (cnt % 5 == 0) {
                printf("\n");
            }
        }
        x++;
    }
}
//运行结果
input maximum:40
2 3       5       7       11
13      17      19      23      29
31      37      41      43      47
53      59      61      67      71
73      79      83      89      97
101     103     107     109     113
127     131     137     139     149
151     157     163     167     173

p44 离开多重循环

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

p45 前n项求和

  • f ( n ) = 1 + 1 2 + 1 3 + 1 4 + . . . + 1 n f(n)=1+\frac{1}{2}+\frac{1}{3}+\frac{1}{4}+...+\frac{1}{n} f(n)=1+21+31+41+...+n1
int main() {
    int n = 0;
    double temp = 0;
    printf("input:");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
        temp = temp + 1.0 / i;  // 1/i是int类型,所以要用1.0/i
    }
    printf("result:%.2lf", temp);
}
  • f ( n ) = 1 − 1 2 + 1 3 − 1 4 + . . . + 1 n f(n)=1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+...+\frac{1}{n} f(n)=121+3141+...+n1
int main() {
    int n = 0;
    double temp = 0;
    printf("input:");
    scanf("%d", &n);

    for (int i = 1; i <= n; i++) {
//        temp = temp + 1.0 / i;// 1/i是int类型
        if (i % 2 == 1) {
            temp = temp + 1.0 / i;
        } else {
            temp = temp - 1.0 / i;
        }
    }
    printf("result:%.2lf", temp);
}
  • 对于第二题,一加一减的计算方式,视频中给出了更好的答案,通过定义一个新的变量sign=1,在每一轮的循环中,我们将sign取其相反数。这种方法更加简单直接,同时避免了上一个答案中的if判断。

    2021-05-08_163345.png

p46 整数分解

  • 正序分解整数
    • 输入一个非负整数,正序输出它的每一位数字
    • 输入:13425,输出:1 3 4 2 5
int main() {
   int x;
   printf("inuput:");
   scanf("%d", &x);
   int count = 1;
   int t = x;
   while (t > 9) {
       t /= 10;
       count *= 10;
   }
   do {
       int d = x / count;
       printf("%d", d);
       if (count > 9) {
           printf(" ");
       }
       x %= count;
       count /= 10;
   } while (count > 0);
}

p47 求最大公约数

  • 输入两个数a和b,输出它们的最大公约数
    • 如输入:12 19,输出:6
  • 枚举法
    • 如果求最小公约数,可以在14行后面加上break;
int main() {
    int a, b;
    int min;
    int ret = 0;
    printf("input a and b:");
    scanf("%d %d", &a, &b);

    min = a;
    if (a > b) {
        min = b;
    }
    for (int i = 1; i <= min; i++) {
        if (a % i == 0 && b % i == 0) {
            ret = i;
        }
    }
    printf("%d和%d的最大公约数是%d", a, b, ret);
}
  • 辗转相除法
  1. 如果b=0,计算结束,a就是最大公约数
  2. 否则,计算a%b,让a=b,而b等于余数
  3. 回到第一步
int main() {
    int a, b;
    int ret = 0;
    printf("input a and b:");
    scanf("%d %d", &a, &b);

    while (b != 0) {
        int c = a % b;
        a = b;
        b = c;
    }
    printf("%d", a);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值