You need to enable JavaScript to run this app. 求解Self Number的C语言程序无输出结果,请帮忙排查代码错误
优惠活动
大模型
产品
解决方案
定价
更多

求解Self Number的C语言程序无输出结果,请帮忙排查代码错误

自数求解程序无运行结果问题排查

问题背景

编写程序求解10000以内的自数,编译运行后无任何控制台输出,自认算法逻辑符合预期,需要定位代码中的错误。

自数定义:无法通过某整数与其自身所有数位数字相加的规则生成的整数,通用求解逻辑为:先标记所有可通过上述规则生成的数,剩余未被标记的数即为自数。

待排查代码

#include <stdio.h>

int selfarr[10001];

int findselfnumber(int n)
{
    int a = n;
    do{
        a += n%10;
    }while((n/10) != 0);
    return a;       
}

int main(void)
{
    int i = 1;    
    for(; i++<=10000;)
        selfarr[findselfnumber(i)] = 1;
    for(; i++<=10000;)        
        if(selfarr[i]!=1) 
            printf("%d\n", i);
  
    return 0;   
}

已定位的代码错误

  • 循环变量复用导致输出循环完全失效
    第一个遍历标记非自数的循环执行完毕时,变量i的值已经自增到10001。后续第二个遍历打印自数的循环直接复用这个值作为起点,循环判断条件为i++ <=10000,初始值已不满足进入循环的要求,因此循环体一次都不会执行,最终无任何输出。
  • 数位求和逻辑缺失步骤
    自数生成规则要求累加原数的所有数位值,但findselfnumber函数的循环内仅对n做取模累加,从未对n本身做整除10的数位剥离操作。以n=12为例,循环会反复计算n%10=2并累加,永远不会取到十位的1,最终返回的生成数值完全不符合规则,会导致标记数组的赋值全部出错。

修正思路

  1. 两个独立的遍历循环需要分别给循环变量i重新赋初始值1,不要直接复用前一个循环结束后的变量值。
  2. 在数位拆分的循环内,每完成一次取模累加操作后,补充n = n / 10语句,逐步剥离已经计算过的低位数值,保证能完整累加所有数位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 04:06:03