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

Aliquot Sequence代码处理6、28等amicable number时陷入死循环求助

问题根因
  • 完全数触发逻辑死锁:6、28属于完全数,其所有真因数之和等于自身。你代码中仅在if(s!=0&&s!=n)成立时才会更新n、重置s和i,完全数场景下该条件永远不满足,外层while(n!=1)循环会一直卡死。
  • 变量重置逻辑覆盖不全:if条件不触发时,s和i不会被重置,下一轮外层循环时i保留上一轮的终值,远大于当前n/2,内层求和逻辑直接跳过,状态永远无法更新。
  • 隐藏漏洞:遇到亲和数对(如220和284)、社交数环时,序列会进入重复循环,现有逻辑没有重复检测机制,同样会触发死循环。
修复后参考代码
#include <stdio.h>
// 配置序列最大长度,避免极端长序列占用过多资源
#define MAX_SEQ_LENGTH 1000

int main()
{
    int n;
    printf("请输入初始值n:");
    scanf("%d", &n);
    // 存储已出现的数值,用于循环检测
    int appeared[MAX_SEQ_LENGTH] = {0};
    int seq_count = 0;

    while(n != 1) {
        int s = 0;
        // 先检测是否进入循环
        for(int j = 0; j < seq_count; j++) {
            if(appeared[j] == n) {
                printf("检测到循环序列,终止运行,最后值:%d\n", n);
                return 0;
            }
        }
        // 超过长度限制直接终止
        if(seq_count >= MAX_SEQ_LENGTH) {
            printf("序列长度超出上限,终止运行\n");
            return 0;
        }
        appeared[seq_count++] = n;
        // 计算真因数和
        for(int i = 1; i <= n/2; i++) {
            if(n % i == 0) {
                s += i;
            }
        }
        // 处理完全数场景
        if(s == n) {
            printf("%d 是完全数,序列结束\n", n);
            break;
        }
        printf("%d\n", s);
        n = s;
    }
    if(n == 1) {
        printf("1\n序列结束\n");
    }
    return 0;
}
优化思路说明
  • 把s和i的声明/重置移到外层循环内部,不管判断条件是否触发,每轮计算都用全新的变量,避免状态残留
  • 新增已出现数值的存储与检测逻辑,遇到重复值直接终止,覆盖完全数、亲和数、社交数环所有循环场景
  • 增加序列长度上限,避免罕见的长Aliquot序列占用过多运行资源

内容的提问来源于stack exchange,提问作者MED LDN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:15:03