Smith Number判断程序陷入无限循环无输出,请求问题排查
排查并修复Smith Number判断程序的无限循环问题
问题描述
编写了一个判断输入数字是否为Smith Number的程序,但运行时接收输入后无任何输出,推测陷入无限循环,代码如下:
#include <stdio.h> void smith(int n) { int num, sd = 0, sf = 0, i, t, c, j; num = n; while (num > 0) { sd = sd + (num % 10); // 计算输入数字的各位数字之和 num = num / 10; } num = n; while (num > 1) // 计算该数字的因数 { for (i = 1; i <= num; i++) { if (num % i == 0) break; } c = 0; t = i; for (j = 1; j <= i; j++) // 判断该数是否为质数 { if (i % j == 0) c++; } if (c == 2) { while (i > 0) { sf = sf + (i % 10); i = i / 10; } } num = num / t; } if (sd == sf) { printf("Smith Number"); } else printf("Not a Smith Number"); } int main() { int n; printf("Enter a number"); scanf("%d", &n); smith(n); }
问题根源
无限循环的核心原因是找最小因数的循环逻辑错误:
- 在
for (i = 1; i <= num; i++)中,num % 1 == 0永远成立,所以第一次循环i=1就会break。 - 随后
num = num / t(t=1),num的值完全不变,外层while (num > 1)的条件永远满足,导致程序陷入无限循环。
另外还有两个次要问题:
- 未处理输入n=1的边界情况(1不是Smith Number)。
- 判断质数的循环效率较低,但不影响程序运行。
修复方案
- 调整找最小质因数的循环,从i=2开始遍历,而非i=1。
- 增加n=1的边界判断。
- 优化质数判断逻辑(可选,提升效率)。
修复后的代码:
#include <stdio.h> // 辅助函数:判断一个数是否为质数 int isPrime(int num) { if (num <= 1) return 0; if (num == 2) return 1; if (num % 2 == 0) return 0; for (int i = 3; i * i <= num; i += 2) { if (num % i == 0) return 0; } return 1; } void smith(int n) { // 处理边界情况:1不是Smith Number if (n == 1) { printf("Not a Smith Number"); return; } int num, sd = 0, sf = 0, i, t; num = n; // 计算输入数字的各位数字之和 while (num > 0) { sd += num % 10; num /= 10; } num = n; // 分解质因数并计算各位数字之和 while (num > 1) { // 从2开始找最小质因数 for (i = 2; i <= num; i++) { if (num % i == 0 && isPrime(i)) { break; } } t = i; // 累加当前质因数的各位数字之和 int temp = t; while (temp > 0) { sf += temp % 10; temp /= 10; } // 缩小num的值 num /= t; } if (sd == sf) { printf("Smith Number"); } else { printf("Not a Smith Number"); } } int main() { int n; printf("Enter a number: "); scanf("%d", &n); // 额外处理非正整数输入 if (n <= 0) { printf("Not a Smith Number"); return 0; } smith(n); return 0; }
修复说明
- 替换了原有的质数判断逻辑为独立的
isPrime函数,更高效且易读。 - 找质因数时直接从2开始,确保找到的第一个因数是质因数,避免了无效的1的干扰。
- 增加了对n=1和非正整数的边界处理,覆盖更多输入场景。
- 修改了原代码中修改循环变量i的问题(原代码在处理各位和时修改了i,可能导致后续逻辑混乱,现在用temp变量替代)。
内容的提问来源于stack exchange,提问作者Xendaine99
相关产品推荐
相关产品推荐

