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

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)的条件永远满足,导致程序陷入无限循环。

另外还有两个次要问题:

  1. 未处理输入n=1的边界情况(1不是Smith Number)。
  2. 判断质数的循环效率较低,但不影响程序运行。

修复方案

  1. 调整找最小质因数的循环,从i=2开始遍历,而非i=1。
  2. 增加n=1的边界判断。
  3. 优化质数判断逻辑(可选,提升效率)。

修复后的代码:

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:51:45