我已经写了一些代码来解决c中的英国信息学奥林匹克问题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;
}发布于 2012-08-22 00:19:40
int numbers[input-2];
这将在堆栈上创建一个整数数组。堆栈的大小是有限的;这通常是几兆字节或更少的数量级上的2的幂。520558可疑地接近2^19,这表明堆栈区域为2Mb。
如果您正在处理如此大的数组,则应改用堆:
int * numbers = (int*)malloc((input-2)*sizeof(int));
.
.
.
free(numbers);
return 0;发布于 2012-08-22 00:24:07
尝试用以下代码替换您的numbers声明:
int* numbers = (int *) malloc((input-2)*sizeof(int));正如squiguy提到的,这将在堆上动态分配数组,从而避免您可能遇到的任何潜在堆栈问题。完成后,您还应该使用以下命令释放它:
free(numbers);发布于 2012-08-22 00:19:16
最好在堆上而不是堆栈上分配numbers变量:
#define MAXNUMS 1000000
int numbers[MAXNUMS];
int main() {
...
}https://stackoverflow.com/questions/12058951
复制相似问题