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;
}