我已经写了一些代码来解决英国信息学奥林匹克问题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;
}
答案 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() {
...
}