求助:用递归实现去除数字最右位后的求和功能(附问题代码)
解决递归计算去除最右位后各位数字之和的问题
看起来你现在的代码逻辑搞反方向啦——你当前的sumDigits函数是在累加除了最左位的所有数字,而我们需要的是累加除了最右位的数字。另外直接反转数字处理末尾有0的情况(比如100)确实会踩坑,因为反转后前导0会被忽略,导致逻辑出错。
我给你一个直接满足需求的递归实现,同时解决这两个问题:
#include <iostream> using namespace std; int partSum(int num) { // 单个数字的情况:去掉最右位后没有数字,返回0 if (num < 10) { return 0; } // 递归逻辑:先处理去掉当前最右位后的数,再加上这个数的最右位(也就是原数的倒数第二位) return partSum(num / 10) + (num / 10) % 10; } int main() { int num = 1234; cout << partSum(num) << endl; // 输出6,符合预期 num = 100; cout << partSum(num) << endl; // 输出1,正确 return 0; }
逻辑解释:
- 当输入是单个数字(
num < 10),直接返回0,完全符合需求。 - 对于多位数,
num / 10就是去掉最右位后的数字,我们需要计算这个数字的各位和:- 递归调用
partSum(num / 10)会处理这个数字的高位部分(比如1234的num/10是123,递归处理123的高位部分) (num / 10) % 10取的是这个数字的最右位(也就是原数的倒数第二位,比如1234的num/10是123,取到3)- 把这两部分加起来,就得到了去掉最右位后的所有数字之和。
- 递归调用
为什么你的原代码不对?
你的sumDigits函数是从最右位开始累加,直到剩下单个数字返回0:
int sumDigits(int num) { if (num<10) return 0; return num%10 + sumDigits(num / 10); }
比如输入1234,它会计算4 + 3 + 2 + 0 = 9,这是除了最左位1的数字和,刚好和需求相反。
而反转数字的方法存在隐患:比如输入102,反转后得到201,求和得到2+0+1=3,但正确结果应该是去掉最右位后的10的数字和1+0=1,这时候结果就完全错误了!所以反转的方法不可靠。
上面的递归实现完全避开了这些问题,直接针对需求设计逻辑,不管数字末尾有没有0都能正确计算。
内容的提问来源于stack exchange,提问作者Ztude
相关产品推荐
相关产品推荐

