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
相关产品推荐
相关产品推荐

