使用For循环计算遇问题:如何修正隔位数字乘2求和程序?
修正C语言程序:实现每隔一位数字乘2求和功能
原程序存在的问题
- 变量溢出:
long类型最大值约为9e18,循环中x=x*100会超出范围导致x变为负数,彻底打乱循环逻辑。 - 内层循环逻辑错误:
for( long j = 10; j == x/10; j=j*100)的条件仅会执行一次,无法正确提取目标位的数字。 - 乘2后数字处理逻辑失效:由于前面的位提取错误,即便十位判断逻辑能覆盖部分情况,最终结果也完全偏离预期。
- 循环终止条件不合理:
x <1000000000000000000会让x溢出后仍继续循环,引发不可预测的计算。
修正后的代码
#include <cs50.h> #include <stdio.h> int main(void) { long number; int sum = 0; do { number = get_long("Number: "); } while (number < 1000000000000 || number > 10000000000000000); // 从倒数第二位开始,每隔一位取数字处理 long temp = number / 10; // 先去掉最后一位,定位到倒数第二位 while (temp > 0) { int digit = temp % 10; // 提取当前目标位的数字 int doubled = digit * 2; // 计算乘2后的各位和:拆分十位与个位相加 sum += (doubled / 10) + (doubled % 10); temp = temp / 100; // 跳过一位,处理下一个目标位 } printf("%d\n", sum); return 0; }
关键修改说明
- 简化逻辑与变量:移除冗余变量,用
temp逐步缩小处理中的数字,代码更易读。 - 彻底避免溢出:通过除法缩小数字,不再使用乘法放大循环变量,从根源解决溢出问题。
- 精准提取目标位:先将原数除以10去掉最后一位,之后每次取余10得到当前目标位,再除以100跳过下一位,确保只处理从倒数第二位开始的每隔一位数字。
- 完善求和逻辑:直接拆分乘2后的数字(0-18)的十位与个位相加,无需特殊判断,覆盖所有可能情况。
测试验证
- 输入
1234:程序处理3和1,32=6、12=2,总和为8,符合预期。 - 输入
1111111111111111:共8个目标位(每个1),每个1*2=2,总和为16,输出正确。
内容的提问来源于stack exchange,提问作者Guy
相关产品推荐
相关产品推荐

