求解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,最终返回的生成数值完全不符合规则,会导致标记数组的赋值全部出错。
修正思路
- 两个独立的遍历循环需要分别给循环变量
i重新赋初始值1,不要直接复用前一个循环结束后的变量值。 - 在数位拆分的循环内,每完成一次取模累加操作后,补充
n = n / 10语句,逐步剥离已经计算过的低位数值,保证能完整累加所有数位。
内容的提问来源于stack exchange,提问作者wonchan kim
相关产品推荐
相关产品推荐

