解析两段while循环协作实现整数各位拆分的工作原理
解析整数各位拆分代码的两段while循环逻辑
先贴出完整代码:
#include <stdio.h> int main() { int num, temp, factor = 1; printf("Enter a 5 digit number: "); scanf("%d", &num); temp = num; while (temp) { temp = temp / 10; factor = factor * 10; } while (factor > 1) { factor = factor / 10; printf("%d ", num / factor); num = num % factor; } return 0; }
第一段while循环:计算位数对应的定位因子
这段循环的核心是算出一个比输入数字位数多一位的10的幂次,拿输入5位数12345举例:
- 初始
temp等于输入的12345,factor初始是1 - 第一次循环:
temp = 12345 / 10 = 1234,factor = 1 * 10 = 10 - 第二次循环:
temp = 1234 / 10 = 123,factor = 10 * 10 = 100 - 第三次循环:
temp = 123 / 10 = 12,factor = 100 * 10 = 1000 - 第四次循环:
temp = 12 / 10 = 1,factor = 1000 * 10 = 10000 - 第五次循环:
temp = 1 / 10 = 0,factor = 10000 * 10 = 100000 - 当
temp变成0时循环结束,此时factor是100000(即10的5次方)
简单说,这段循环就是数清楚输入数字的位数,生成一个能定位到最高位的放大因子,为后续拆分做准备。
第二段while循环:逐位拆分输出
这段循环用前面得到的factor,从最高位开始逐一拆分数字:
- 初始
factor是100000,满足factor > 1的条件,进入循环:factor = 100000 / 10 = 10000num / factor = 12345 / 10000 = 1——这就是最高位数字,直接输出num = 12345 % 10000 = 2345——去掉已经输出的最高位,保留剩余部分
- 下一次循环,
factor=10000仍满足条件:factor=10000/10=10002345/1000=2——输出第二位num=2345%1000=345——继续保留剩余部分
- 重复这个过程,直到
factor变成1:- 最后一次循环时,
factor=10,除以10后变为1,此时num是5,5/1=5输出最后一位,num=5%1=0 - 下一次判断
factor=1>1不成立,循环结束
- 最后一次循环时,
两段循环的协同逻辑
第一段循环相当于**“探路”:先摸清楚数字的位数,算出能定位最高位的因子;第二段循环则是“落地执行”**:用这个因子从高位到低位,依次把每一位数字“摘”出来输出,每处理完一位就缩小因子,同时截断原数字的已处理部分,直到所有位数都拆分完成。
内容的提问来源于stack exchange,提问作者Dave Balanghig
相关产品推荐
相关产品推荐

