C语言while循环语句练习
练习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的余数就是最后剩下的被除数。
- 数值较大时注意溢出问题(练习题中可忽略)。