C语言中计算从倒数第二位开始隔位数字之和的代码问题排查
你的校验和代码问题分析与修正
核心问题点
pow函数的精度陷阱pow是浮点运算函数,计算10的整数次幂时可能出现精度误差,比如pow(10, 2)实际返回值可能是99.9999999999,强制转成int后就变成了99,导致你取位的计算完全错误。处理数字位的操作应该用整数运算,避免浮点函数。循环逻辑混乱
你在循环里同时做了两件矛盾的事:一边用pow(10, i-1)去取原数字的高位,一边又把number除以10修改它的值。这会导致每次循环取到的位完全不符合预期,比如第二次循环时number已经是原数的1/10,再用pow(10,2)取位,结果完全错位。循环条件不符合需求
你的循环从i=2到i<=d,但d的定义不明确,而且这个逻辑无法实现“从倒数第二位开始,每隔一位取数”的需求——你需要的是从右往左,跳过最后一位,然后依次取倒数第2、4、6...位,而不是按固定次数循环。
修正后的代码示例
下面是实现需求的正确写法,用纯整数运算处理,逻辑清晰:
// 实现从倒数第二位开始,每隔一位数字乘2后的和 int sum = 0; // 先去掉最后一位,从倒数第二位开始处理 number = number / 10; // 循环处理:每次取当前最后一位,然后右移两位(跳过下一位) while (number > 0) { // 取当前数字的最后一位 int digit = number % 10; sum += digit * 2; // 右移两位,跳过下一位,处理下一个目标位 number = number / 100; } printf("%i", sum);
逻辑说明
- 第一步
number = number /10:直接去掉原数字的最后一位,让当前数字的最后一位就是原数字的倒数第二位。 - 循环里
number %10取当前最后一位(也就是原数字的倒数第2、4、6...位),乘2后加到sum。 number = number /100:把数字右移两位,跳过不需要处理的那一位,继续处理下一个目标位,直到数字变为0停止循环。
内容的提问来源于stack exchange,提问作者Alona Chaika
相关产品推荐
相关产品推荐

