1

私は、英国の情報学オリンピックの質問1(2012)をcで解決するためのコードをいくつか作成しました。それが誰かの助けになるか、おそらく興味があるなら、プログラムは数のユニークな素因数の積を見つけます。数が素数の場合、元の数を返します。

1 000 000の入力まで動作するはずであり、LinuxおよびMacでコンパイルすると動作します。

何らかの理由で(mingwコンパイラを使用して)Windowsでコンパイルすると、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;
}
4

3 に答える 3

3

int numbers[input-2];

これにより、スタック上に整数配列が作成されます。スタックのサイズには制限があります。これは通常、数メガバイト以下のオーダーの2の累乗です。520558は疑わしいことに2^19に近く、2Mbのスタック領域を示唆しています。

これほど大きな配列を扱っている場合は、代わりにヒープを使用する必要があります。

int * numbers = (int*)malloc((input-2)*sizeof(int)); 
. 
. 
. 
free(numbers); 
return 0;
于 2012-08-21T16:19:40.027 に答える
2

numbers宣言を次のように置き換えてみてください。

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

squiguyが述べたように、これはヒープに配列を動的に割り当て、潜在的なスタックの問題を回避します。また、完了したら、次のように解放する必要があります。

free(numbers);
于 2012-08-21T16:24:06.677 に答える
0

numbersスタックではなく、ヒープに変数を割り当てることをお勧めします。

#define MAXNUMS 1000000
int numbers[MAXNUMS];

int main() {
...
}
于 2012-08-21T16:19:16.097 に答える