3
  1. 用户输入正整数值 ( 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整数,因为你说你只有正数。代码假定序列至少有一个元素。

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

您的“测试工具”可能已损坏,或者希望您在使代码难以阅读的同时进行无意义的微优化,编译器无论如何都会这样做。

  1. 您需要询问用户numberof numbers => 1scanf你这样做了。
  2. 接下来,您需要向用户询问numbernumbers => scanf, numbertimes你这样做了。
  3. 接下来,您需要找到最大的 =>循环number时间,并比较. 您已经在与前一个相同的循环中实现了这一点。你做得很好,因为你做了尽可能少的number - 1比较
  4. 接下来,您需要打印结果 => 1printf你也这样做了。

这是您可能获得的最快速度[1]。没有“优化”余地。

[1] 如果您有 2 个内核,并且正在编写一个多线程程序,您可以通过流水线更快地执行第 2 步和第 3 步(请参阅 unkulunkulu 的评论,了解为什么这是您可以获得的最快速度)。

于 2012-06-25T10:43:29.143 回答
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 个 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 回答
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 回答