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

标签 c windows

我写了一些代码来解决英国信息学奥林匹克问题 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/

相关文章:

c - 通过函数分配矩阵内存

C-解析文本和调用函数

java - 如何使用 Java 凭据连接到网络驱动器?

windows - 如何找出哪个用户以编程方式将打印命令发送到 windows/windows 服务器?

c++ - 提取当前可执行文件名称

c - 数字滤波算法

c - C 中动态大小的二维字符数组?

c - 在函数中分配动态数组并将其发送回 C 中的调用者

windows - electron-builder:卸载程序后如何删​​除深度链接协议(protocol)?

windows shell - 如何检测脚本文件的当前位置?