1

標準入力を読み取り、標準出力を出力する、C の学校割り当ての小さなプログラムとして実行する必要があります。より具体的には、数字を読んで並べ替えるということです。

(これはスキップできます。これはコードを理解するためのものです) 入力の最初の行で、数値の行数を決定する必要があります。2 行目は、次の行の数値の量です。3行目は具体的な数字です。4行目は次の行の数値の量であり、K行数に達するまで続きます。制限は 0 < K <= 10 (最大 10 シーケンス) で、各シーケンスには最大 10.000.000 の数値を含めることができ、各数値の値は最大 10.000.000 です。

入力例 :

  1. 2 //これは、数字とそれに対応する金額の 2 つのシーケンス (行) があることを意味します
  2. 3 //最初のシーケンスには 3 つの数字があります
  3. 5 99912 45 //最初のシーケンス
  4. 6 //2 番目のシーケンスには 6 つの数字があります
  5. 9489498 22131 0 521313 7988956 5 //2 番目のシーケンス

出力:

0 5 5 45 22131 99912 521313 7988956 9489498

だから私は作業プログラムを実行しましたが、値が高いと不安定になるようです。ただし、プログラムがいつどこで失敗するかを正確に判断することはできません。私のコンピューターでは、考えられるすべての最大値をテストし、適切な時間内に正しい出力を返しましたが、テストが行​​われた学校のサーバーでは、高い値を処理できず、失敗しました。

プログラムは C++ ではなく C のみを使用する必要がありますが、それらの違いがよくわかりません。また、C++ コンパイラを使用していたため、コードが生の C ではない可能性があります。

私は C の初心者で、これは私にとって「Hello world」のようなものです。コードをざっと見て、何が不安定になっているのか教えていただけますか? ありがとう

#include <stdio.h>
#include <stdlib.h>

int main(void) {    
    int k, n, i, y, x, index = 0;
    int *numbers = (int*) malloc(100000000 * sizeof(int));
    if(numbers == NULL){
        exit(1);
    }
    scanf("%d", &k);
    for (x = 0; x < k; x++) {
        y = 0;
        scanf("%d", &n);
        while(scanf("%d", &i) > 0){
            numbers[index++] = i;
            if(++y == n){
                break;
            }
        }
    }
    for(y = 0;y < index;y++){   //find and print all 0's, because later I will use 0 as a
                                //already used (printed) element in array and ignore it      
        if(numbers[y] == 0){
            if(y == index-1){
                printf("0");
            }else{
                printf("0 ");
            }
        }
    }
    int smallest, smallestIndex;
    for(x = 0;x < index;x++){   //print all other numbers in ascending order
        smallest = 0;
        for(y = 0;y < index;y++){  //find current smallest number
            if((numbers[y] < smallest || smallest == 0) && numbers[y] != 0){
                smallest = numbers[y];
                smallestIndex = y;
            }
        }
        numbers[smallestIndex] = 0;
        if(smallest > 0){
            if(x == index-1){
                printf("%d", smallest);
            }else{
                printf("%d ", smallest);
            }
        }
    }
    free(numbers);
    numbers = NULL;
    return 0;
}
4

4 に答える 4

0

あなたが提供した情報に基づいて、これは単にサーバーのリソース制限だと思います. サーバーは単にメモリ不足になり、malloc()失敗します。デバッグするか、これを行うことをお勧めします:

if(numbers == NULL){
    printf("malloc() failed\n");
    exit(1);
}
于 2012-10-05T17:18:50.447 に答える
0

最初のゼロを表示するコードは怪しいです:

for(y = 0;y < index;y++){   //find and print all 0's, because later I will use 0 as a
                            //already used (printed) element in array and ignore it      
    if(numbers[y] == 0){
        if(y == index-1){
            printf("0");
        }else{
            printf("0 ");
        }
    }

最後の要素が 0 のシーケンスがあるとします (例: 1 2 3 4 5 0)。このコードは0後にスペースなしで印刷され、後続のコード1 2 3 4 501 2 3 4 5.

出力をできるだけ美しくしたい、つまり最後にスペースを入れないようにしたいということは理解しています。また、出力の最後に改行 ( \n) を付けるとよい場合もあります。

于 2012-10-05T18:00:43.547 に答える
-1

間違った量のメモリを割り当てています。仕様では、固定量を割り当てるのに対し、シーケンスには1,000万の値を含めることができると規定されています。最大k*1000万の入力値が存在する可能性があり、割り当てた量が十分であるかどうかを知ることはできません。

m0skit0で指摘されているように、この問題は割り当て超過が原因である可能性もあります。

この問題を解決するには、必要な量のメモリを割り当てる必要があります。それ以上でもそれ以下でもありません。これを行うには、各シーケンスに提供されているシーケンスの長さを使用します。また、との戻り値を確認する必要がありmallocますrealloc。戻り値がNULL割り当てに失敗した場合は、エラーメッセージとを出力する必要がありますexit

于 2012-10-05T18:54:16.703 に答える
-1

私はあなたのプログラムの最初の部分を書き直して、あなたを正しい道に導きました。これは役立つはずですが、プログラムがクラッシュする原因が本当にわからないため、確信が持てません。

reallocこれにより、プログラムが現在よりも大幅に効率化されるはずの機能が実装されます。何がわからない場合は、ここここreallocで読むことができます。

#include <stdio.h>
#include <stdlib.h>
#define BUFFER 256                                                  //for memory management         

int main(void) 
{    
    int k, n, i, y , x, index = 0, bff;                             //declare integer 'bff' and set it to BUFFER
    int *numbers = NULL, *tmp;                                      //declare a pointer (numbers) for allocated memory, and a pointer (tmp) for the realloc function

    if(!(numbers = malloc(BUFFER * sizeof(int))))                   //allocate space for 'bff' integers
    {
        exit(1);                                                    //allocation failed
    }
    scanf("%d", &k);
    for (x = 0; x < k; x++) 
    {
        scanf("%d", &n);
        while(scanf("%d", &i) > 0)
        {
            if(bff <= index)                                        //if the size of index grows larger than the amount of space we allocated
            {
                bff += BUFFER;                                      //increase the size of bff by BUFFER
                if(!(tmp = realloc(numbers, bff * sizeof(int))))    //resize our allocated memory block using the tmp pointer 
                {
                    free(numbers);                                      //allocation failed so free already allocated memory
                    exit(1);                                        //and terminate the program
                }
                numbers = tmp;                                      //make numbers point to the same location as tmp
                numbers[index++] = i;                               
                if(++y == n) break;
            }
        }
    }
    .
    .
    .
    free(numbers);
    return 0;
}

realloc を使用するより効率的な方法があることに注意してください。正しい軌道に乗るために、ここにこれを投稿しました。幸運を!

于 2012-10-05T18:48:52.820 に答える