3
  1. ユーザーは正の int 値 ( number) を入力します。
  2. ユーザーはnumberint 値を出力します。
  3. 最大値を見つけて印刷する必要があります。

私のコードは

#include <stdio.h>

int main() {
    int number;
    int max;
    int temp;

    scanf("%d", &number);
    scanf("%d", &max);

    for ( int i = 1; i < number; i++ ) {
        scanf("%d", &temp);
        if ( temp > max ) {
            max = temp;
        }
    }

    printf("%d\n", max);
    return 0;
}

これは機能しますが、オンライン テスト ツールは、あまりにも多くの操作を使用するため、コードを最適化する必要があると言っています。配列は禁止されています。stdio のみ使用できます。

4

6 に答える 6

4

Duff のデバイスを使用すると、for ループでいくつかの比較を保存できます。それは悪い習慣ですが、おそらくそれがあなたが期待されていることです。

#include <stdio.h>

int main (void) {
    unsigned max = 0;
    unsigned length;
    scanf("%u", &length);

    unsigned temp = 0;
    unsigned iterations = (length+8-1) / 8;
    switch (length % 8) {
        case 0: do { scanf("%u", &temp); if (temp > max) max = temp;
        case 7:      scanf("%u", &temp); if (temp > max) max = temp;
        case 6:      scanf("%u", &temp); if (temp > max) max = temp;
        case 5:      scanf("%u", &temp); if (temp > max) max = temp;
        case 4:      scanf("%u", &temp); if (temp > max) max = temp;
        case 3:      scanf("%u", &temp); if (temp > max) max = temp;
        case 2:      scanf("%u", &temp); if (temp > max) max = temp;
        case 1:      scanf("%u", &temp); if (temp > max) max = temp;
                } while (--iterations > 0);
    }

    printf("%u\n", max);
    return 0;
}

unsigned正の数しかないと言ったので、intを使用しました。このコードは、シーケンスに少なくとも 1 つの要素があることを前提としています。

更新 1:

手動ループ展開を使用した例。これは、ダフの装置よりもさらに悪い習慣です。あなたが手に入れたテストツールはそれを気に入るかもしれませんが、潜在的な雇用主に感銘を与えるためにこのコードを決して使用しないでください!

#include <stdio.h>

int main (void) {
    signed max = -0x80000000;
    unsigned length;
    scanf("%u", &length);

    signed temp;
    for (; length >= 8; length -= 8) {
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
    }
    if (length > 4) {
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        scanf("%d", &temp); if (temp > max) max = temp;
        length -= 4;
    }
    for (; length > 0; --length) {
        scanf("%d", &temp); if (temp > max) max = temp;
    }

    printf("%d\n", max);
    return 0;
}

更新 2:

scanf があまり呼び出されない場合、評価ツールはそれを好むと述べたので、次のようになります。

#include <stdio.h>
int main (void) {
    signed max = -0x80000000;
    unsigned length;
    scanf("%u", &length);

    signed t1, t2, t3, t4, t5, t6, t7, t8;
    for (; length >= 8; length -= 8) {
        scanf("%d%d%d%d%d%d%d%d", &t1, &t2, &t3, &t4, &t5, &t6, &t7, &t8);
        if (t1 > max) max = t1;
        if (t2 > max) max = t2;
        if (t3 > max) max = t3;
        if (t4 > max) max = t4;
        if (t5 > max) max = t5;
        if (t6 > max) max = t6;
        if (t7 > max) max = t7;
        if (t8 > max) max = t8;
    }
    if (length > 4) {
        scanf("%d%d%d%d", &t1, &t2, &t3, &t4);
        if (t1 > max) max = t1;
        if (t2 > max) max = t2;
        if (t3 > max) max = t3;
        if (t4 > max) max = t4;
        length -= 4;
    }
    for (; length > 0; --length) {
        scanf("%d", &t1); if (t1 > max) max = t1;
    }

    printf("%d\n", max);
    return 0;
}
于 2012-06-25T11:04:57.017 に答える
2

2つではなく1つのscanf()を使用する必要があります。

#include <stdio.h>

int main() {
    int number;
    int max;
    int temp;

    scanf("%d %d", &number, &max);
    for ( int i = 1; i < number; i++ ) {
        scanf("%d", &temp);
        if ( temp > max ) {
            max = temp;
        }
    }
    printf("%d\n", max);
    return 0;
}

申し訳ありませんが、皆さんに感謝します!抱擁とキス!

于 2012-06-25T12:08:38.870 に答える
2

コードゴルフ競技ではない操作が多すぎるとどのテストツールが言っているのか知りたいです。また、許容される操作の数と、それらが「操作」をどのように定義するか。

#include <stdio.h>

int main() {
    int numbersLeft,
        number,
        max = 0;

    scanf("%d", &numbersLeft);

    while ( numbersLeft-- ) {
        scanf("%d", &number);
        max = number > max? number: max;
    }

    printf("%d\n", max);
    return 0;
}
于 2012-06-25T10:42:27.520 に答える
2

あなたの「テストツール」はおそらく壊れているか、コードを読みにくくしながら無意味なマイクロ最適化を行うことを期待していますが、コンパイラはとにかくそれを行います.

  1. numberユーザーにof numbers => 1scanfを尋ねる必要があります。あなたはこれをしました。
  2. number次に、ユーザーに数字 => scanfnumbertimesを尋ねる必要があります。あなたはこれをしました。
  3. 次に、最大の =>ループnumber時間を見つけて比較する必要があります。これは、前のループと同じループですでに達成されています。number - 1そして、可能な限り最小限の比較を行ったので、うまくいきました
  4. 次に、結果を出力する必要があります => 1printfあなたもこれをしました。

これは可能な限り最速の[1]です。「最適化」の余地はありません

[1] 2 つのコアがあり、マルチスレッド プログラムを作成している場合、パイプライン化することでステップ 2 と 3 をより高速に実行できます (これが最速である理由については、unkulunkulu のコメントを参照してください)。

于 2012-06-25T10:43:29.143 に答える
1

i変数は実際には必要ありませんnumber。それ自体を使用できます。

また、ステートメントを乱用することもできますfor:)

#include <stdio.h>

int main(void) {
    int number;
    int max;
    int temp;

    for (scanf("%d", &number), scanf("%d", &max)
       ; --number && scanf("%d", &temp)
       ; )
    {
        if (temp > max) max = temp;
    }

    printf("%d\n", max);
    return 0;
}
于 2012-06-25T11:20:39.163 に答える
-1
#include <stdio.h>

int main() {
    int number;
    int max;
    int temp,i;

    scanf("%d", &number);

    for ( i = 0; i < number; i++ ) {
        scanf("%d", &temp);
        if(i==0)
            max=temp;
        if ( temp > max ) {
            max = temp;
        }
    }

printf("max=%d\n", max);
return 0;

}

于 2012-06-25T14:11:28.890 に答える