如何从数组中查找max int值

时间:2012-06-25 10:20:45

标签: c

  1. 用户输入正整数值(number);
  2. 用户打印number个int值;
  3. 需要找到最大值并打印出来。
  4. 我的代码是

    #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。

6 个答案:

答案 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整数,因为你说你只有正数。该代码假定序列至少有一个元素。

更新1:

使用手册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;
}

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

答案 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;可能已经坏了,或者期望你在使代码难以阅读的同时进行无意义的微优化,编译器无论如何都会

  1. 您需要询问用户number的数字=&gt; 1 scanf 你做到了。
  2. 接下来,您需要询问用户number个数字=&gt; scanfnumber你做到了。
  3. 接下来你需要找到最大的=&gt; 循环number次,并进行比较您已经在与前一个循环相同的循环中实现了此目的。而且你做得很好,因为你做了最小的number - 1比较
  4. 接下来你需要打印结果=&gt; 1 printf 你也是这样做的。
  5. 这是最快的你可以得到 [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;

}