You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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;
}

关键修改说明

  1. 简化逻辑与变量:移除冗余变量,用temp逐步缩小处理中的数字,代码更易读。
  2. 彻底避免溢出:通过除法缩小数字,不再使用乘法放大循环变量,从根源解决溢出问题。
  3. 精准提取目标位:先将原数除以10去掉最后一位,之后每次取余10得到当前目标位,再除以100跳过下一位,确保只处理从倒数第二位开始的每隔一位数字。
  4. 完善求和逻辑:直接拆分乘2后的数字(0-18)的十位与个位相加,无需特殊判断,覆盖所有可能情况。

测试验证

  • 输入1234:程序处理3和1,32=6、12=2,总和为8,符合预期。
  • 输入1111111111111111:共8个目标位(每个1),每个1*2=2,总和为16,输出正确。

内容的提问来源于stack exchange,提问作者Guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:55:12