大数量的因子分解已停止在for循环中工作

时间:2017-11-30 05:40:18

标签: c arrays

每当我启动程序时,都会出现Windows弹出窗口,并显示“test.exe已停止工作”。我的编译器没有错误。这是我的代码。我已经提到了错误发生的地方,但我无法弄明白。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long factor[999], halfof;
    int i;

    long long num = 600851475143;

    halfof = num / 2;

    for (i = 0; i < 999; i++){
        factor[i] = 0;
    }


    //GETTING ERROR IN THIS "FOR LOOP"
    for (i = 2; i <= halfof; i++){
        if (num % i == 0){
            factor[i] = i;
        }
    }




for (i = 0; i < 999; i++){
        printf("%ld", factor[i]);
    }



    return 0;
}

3 个答案:

答案 0 :(得分:5)

从代码中的代码段下方开始:

long long factor[999], halfof;
long long num = 600851475143;
halfof = num / 2;

这会使halfof方式超过999,这是factor的最大元素。

此处:factor[i] = i;您正在进行超出数组访问,这可能会导致segmentation fault(如果您很幸运)。

答案 1 :(得分:2)

您对数字进行分解的代码是错误的 - 您不应该使用i来跟踪factor的索引。您需要单独跟踪分配了自己索引的最后一个使用因子(我为此添加了一个变量) 根据其他评论,您还需要i一个long long,以便它可以跟踪num。您还可以考虑增加factor中的元素数量来处理具有大量因子的数字(这些数字可能非常小)。

查找num的所有独特因素:

long long i;
int factorIndex = 0;
for (i = 2; i <= halfof; i++){
   if (num % i == 0){
      factor[factorIndex++] = i;
   }
}

for (i = 0; i < factorIndex ; i++){
    printf("%ld ", factor[i]);
}

Example here

备注

  • 这会找到一个数字的所有因子(除了1,数字本身)。将所有素数因子分解为一个完全不同的算法。
  • 999可能不适合许多&#39;混杂的&#39; numbers有很多因素。您可能需要增加数组范围。
  • 您可以查看factors here(免责声明,我的网站)。

答案 2 :(得分:1)

问题

  1. 数组索引

    factor[i] = i中,您将数组从2索引。 你留下索引0,1空白

  2. 循环超过数组大小

    600851475143/2 > 999