C语言知识库

浏览

3.2万

被索引

8
  • 0
  • 0
  • 0
  • C语言while循环语句练习

  • 小言心
  • 1,580
  • 2026-06-08 20:05
  • 练习1:判断2的幂次方

    int n = 24; // 可改为任意正整数
    while (n > 1 && n % 2 == 0) {
        n = n / 2;
    }
    if (n == 1) {
        printf("yes");
    } else {
        printf("no");
    }
    • 思路:反复除以2,看最终能否变成1。
    • 循环条件:n > 1 && n % 2 == 0(大于1且能被2整除才继续)。
    • 循环体:n = n / 2。
    • 结果判断:循环结束若 n == 1 则是2的幂;否则不是。
    • 注意:该写法未处理 n ≤ 0 的情况,实际应用时可先判断正数。

    练习2:折纸超过珠峰高度

    int height = 8844430;  // 毫米(≈8844米)
    double paper = 0.1;    // 毫米
    int count = 0;
    
    while (paper < height) {
        paper = paper * 2;
        count++;
    }
    printf("需要折叠 %d 次", count);
    • 思路:每次折叠厚度翻倍,记录折叠次数,直到厚度超过目标。
    • 初始化:纸厚0.1毫米,珠峰高度8844430毫米(8844米)。
    • 循环条件:paper < height。
    • 循环体:paper = paper * 2; count++;。
    • 核心:用循环模拟指数增长过程,count 即为所需折叠次数。

    练习3:整数反转(如123→321)

    int number = 123456789;
    int rev = 0;
    
    while (number != 0) {
        int temp = number % 10;    // 取个位
        number = number / 10;      // 去掉个位
        rev = rev * 10 + temp;     // 拼接反转
    }
    printf("%d", rev);  // 输出 987654321
    • 思路:依次取出原数个位,拼接到反转结果的末尾。
    • 循环条件:number != 0。
    • 核心算法:temp = number % 10 → 取个位number /= 10 → 去除个位rev = rev * 10 + temp → 拼接
    • 过程示例(123):0×10+3=3 → 3×10+2=32 → 32×10+1=321
    • 关键点:rev 初始为0,循环结束时原数变为0。

    练习4:求算术平方根的整数部分

    int number = 16;  // 可替换为任何非负整数
    int i = 1;
    while (i * i <= number) {
        i++;
    }
    printf("%d", i - 1);  // 输出 4
    • 思路:从1开始尝试,找到最大的 i 使 i*i ≤ number。
    • 循环条件:i * i <= number。
    • 循环体:i++。
    • 结果:输出 i - 1(因为循环结束时 i 已使平方超过原数)。
    • 适用场景:非负整数的暴力枚举法。

    练习5:判断回文数(正反读相同)

    int pdo = 1221;
    int original = pdo;     // 保存原值
    int rev = 0;
    
    while (pdo != 0) {
        int temp = pdo % 10;
        pdo = pdo / 10;
        rev = rev * 10 + temp;
    }
    
    if (rev == original) {
        printf("yes");
    } else {
        printf("no");
    }
    • 思路:将原数反转,与保存的原值比较,相等即为回文数。
    • 步骤:提前保存 original = pdo。利用练习3的方法对 pdo 进行反转得到 rev。判断 rev == original。
    • 易错点:循环条件必须为 pdo != 0,而非 pdo >= 1。必须提前备份原值,否则反转后原数变为0无法比较。

    练习6:减法模拟除法(求商和余数)

    int dividend = 100;   // 被除数
    int divisor = 7;      // 除数(大于0即可)
    int count = 0;
    
    while (dividend >= divisor) {
        dividend = dividend - divisor;
        count++;
    }
    printf("商: %d, 余数: %d", count, dividend);
    • 限制:只能使用加减法,不能用乘、除、取余。
    • 思路:反复用被除数减去除数,能减的次数即为商,最后剩下的被减数即为余数。
    • 循环条件:dividend >= divisor。
    • 循环体:dividend = dividend - divisor; count++;
    • 结果:count 是商,dividend 是余数(循环结束时 dividend < divisor)。
    • 示例:100 ÷ 7,减14次后余2,商14余2。

    整体归纳

    循环设计核心

    先确定 继续循环的条件(进入)与 停止循环的条件(退出),再编写循环体。

    常见模式

    • 数位操作:反复 %10 和 /10(练习3、5)。
    • 倍数/指数增长:反复乘2或除2(练习1、2)。
    • 累加/累减与计数:用计数器记录操作次数(练习2、4、6)。

    易错提醒

    • 需要与原值比较时,务必提前备份(练习5)。
    • 循环结束后要结合条件判断变量的最终状态:如练习4需输出 i-1,练习6的余数就是最后剩下的被除数。
    • 数值较大时注意溢出问题(练习题中可忽略)。

    评论

  • 0
    /1000
    最热
  • 最新

    确认跳转

    您即将离开当前页面,访问外部链接。请注意核对网址,保护隐私安全。

    https://example.com

    言心安全助手 · 建议确认来源可信

    • 0
    • 0
    • 0
    登录后参与评论