number
); number
个int值; 我的代码是
#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。
答案 0 :(得分:4)
通过使用Duff's device,您可以在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
整数,因为你说你只有正数。该代码假定序列至少有一个元素。
使用手册loop unrolling的示例。这比Duff的设备更糟糕。也许您获得的测试工具会喜欢它,但您绝不应该使用此代码来打动潜在的雇主!
#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;
}
你说过,如果不经常调用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;
}
答案 1 :(得分: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;
}
答案 2 :(得分:2)
您的测试工具&#39;可能已经坏了,或者期望你在使代码难以阅读的同时进行无意义的微优化,编译器无论如何都会 。
number
的数字=&gt; 1 scanf
。 你做到了。 number
个数字=&gt; scanf
,number
次。 你做到了。 number
次,并进行比较。 您已经在与前一个循环相同的循环中实现了此目的。而且你做得很好,因为你做了最小的number - 1
比较。printf
。 你也是这样做的。 这是最快的你可以得到 [1] 。 没有“优化”的范围。
[1]如果你有2个内核,并且正在编写一个多线程程序,你可以通过管道化它们来更快地完成第2步和第3步(请参阅unkulunkulu的评论,了解为什么这是最快的你可以得到。)
答案 3 :(得分: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;
}
对不起,谢谢大家!拥抱和亲吻!
答案 4 :(得分: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;
}
答案 5 :(得分:-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;
}