我在尝试运行该程序时遇到了麻烦,我发现该程序是否完美。它给了我一个细分错误。这意味着什么?您能帮我了解我做错了什么吗?这是我的代码:
#include <stdio.h>
void perfect(int number);
int main() {
int n;
printf("Insert a number greater than 0: ");
scanf("%d", &n);
perfect(n);
return 0;
}
void perfect(int number) {
int i, j, array[100], k = 0, tmp = 0, tmp2 = number;
for (i = 2; i <= 1000; i++) {
for (j = 2; j <= 1000; j++) {
if (i % j == 0) {
array[k] = i;
k++;
}
}
}
k = 0;
while (tmp2 != 1) {
if (tmp2 % array[k] == 0) {
tmp += array[k];
tmp2 /= array[k];
}
k++;
}
tmp++;
if (tmp == tmp2) {
printf("It's a perfect number\n");
}
}
答案 0 :(得分:2)
分段错误告诉您您正在尝试访问超出允许范围的内存。您的数组远远不能满足程序的需求。
您需要重新考虑数组中存储的内容。所有不超过一千的数字都可以被其他数字整除,对吗?但实际上它将是
听起来很多,不是100个吗?我还会怀疑您打算重复很多很多次。例如,您将存储6 3次,因为它可以被2、3及其本身整除。 (所以,顺便说一下,一旦j大于i,就应该停止寻找。)
您的while循环也很特殊。它在tmp2为1时终止。tmp如何等于1?
恐怕回到绘图板上!
答案 1 :(得分:0)
鉴于循环索引最大值1000
,数组array
的大小至少应为1001
。大小为100
时,您可能会发生缓冲区溢出,从而导致未定义的行为。