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

求助:用递归实现去除数字最右位后的求和功能(附问题代码)

解决递归计算去除最右位后各位数字之和的问题

看起来你现在的代码逻辑搞反方向啦——你当前的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:44:10