標準入力を読み取り、標準出力を出力する、C の学校割り当ての小さなプログラムとして実行する必要があります。より具体的には、数字を読んで並べ替えるということです。
(これはスキップできます。これはコードを理解するためのものです) 入力の最初の行で、数値の行数を決定する必要があります。2 行目は、次の行の数値の量です。3行目は具体的な数字です。4行目は次の行の数値の量であり、K行数に達するまで続きます。制限は 0 < K <= 10 (最大 10 シーケンス) で、各シーケンスには最大 10.000.000 の数値を含めることができ、各数値の値は最大 10.000.000 です。
入力例 :
- 2 //これは、数字とそれに対応する金額の 2 つのシーケンス (行) があることを意味します
- 3 //最初のシーケンスには 3 つの数字があります
- 5 99912 45 //最初のシーケンス
- 6 //2 番目のシーケンスには 6 つの数字があります
- 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;
}