我写了一些代码来解决英国信息学奥林匹克问题 1 (2012) 在 c 中。如果它对任何人有任何帮助,或者可能感兴趣,程序会找到一个数的唯一质因数的乘积。如果数字是素数,则返回原始数字。
它应该可以处理 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;
}
最佳答案
int numbers[input-2];
这会在堆栈上创建一个整数数组。栈的大小是有限的;这通常是 2 的幂,大约为几兆字节或更少。 520558 可疑地接近 2^19,表明堆栈区域为 2Mb。
如果你正在处理这么大的数组,你应该改用堆:
int * numbers = (int*)malloc((input-2)*sizeof(int));
.
.
.
free(numbers);
return 0;
关于c - 在 c 中运行代码时 Windows 中的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058951/