在c中运行代码时Windows中的奇怪错误

时间:2012-08-21 16:10:18

标签: c windows

我已经写了一些代码来解决英国信息学奥林匹克问题1(2012年)中的问题。如果它对任何人或可能感兴趣的任何帮助,该程序找到数字的唯一素因子的乘积。如果数字是素数,则返回原始数字。

它应该可以达到1 000 000的输入,并且在linux和mac上编译时也是如此。

出于某种原因,当它在windows上编译时(使用mingw编译器),它不适用于520558以上的输入!

这可能与一个长度为520558的数组的声明有关,但我不知道如何解决它。

非常感谢任何帮助

感谢。

代码:

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

int main(int argc, char* argv[]){
    printf("Please enter your input: ");
    int input;
    scanf("%d",&input);
    int numbers[input-2];
    for (int i=0;i<input-2;i++) {
        numbers[i] = i+2;
    }
    for (int i=0;i<input-2;i++) {
        if(numbers[i] == 0) {
            continue;
        }else{
            for (int j=(i+2)*2;j<input;j+=numbers[i]){
                numbers[j-2] = 0;
            }
        }
    }
    int product = 1;
    for (int i=0;i<input-2;i++) {
        if(numbers[i]!=0){
            if(input%numbers[i]==0) {
                product *= numbers[i];
            }
        }
    }
    if(product == 1){
        printf("%u",input); 
    }else{
        printf("%u",product);
    }
    printf("\n");
    // Get rid of this on mac and linuxs
    system("PAUSE");
    return 0;
}

3 个答案:

答案 0 :(得分:3)

int numbers[input-2];

这会在堆栈上创建一个整数数组。堆栈的大小有限;这通常是2的幂,大约几兆字节或更少。 520558可疑接近2 ^ 19,表明存在2Mb堆栈区域。

如果你正在处理这么大的数组,你应该使用堆:

int * numbers = (int*)malloc((input-2)*sizeof(int)); 
. 
. 
. 
free(numbers); 
return 0;

答案 1 :(得分:2)

尝试将numbers声明替换为:

int* numbers = (int *) malloc((input-2)*sizeof(int));

正如提到的那样,这将动态地在堆上分配数组,避免您可能遇到的任何潜在的堆栈问题。完成后你也应该释放它:

free(numbers);

答案 2 :(得分:0)

最好在堆上分配numbers变量而不是堆栈:

#define MAXNUMS 1000000
int numbers[MAXNUMS];

int main() {
...
}