无法找到最大的奇数

时间:2018-03-20 18:41:21

标签: c

  

编写一个程序来检查三个变量 - x,y和z - 和   打印其中最大的奇数。如果它们都不是奇数,那就是   应该打印一条消息。

这是我的源代码:

#include <stdio.h>

int main() {
    int x,y,z;
    x = 11;
    y = 15;
    z = 18;

    if (x > y && x > z && x % 2 != 0)
        printf("%d", x);
    else if (y > z && y > x && y % 2 != 0)
        printf("%d", y);
    else if (z > x && z > y && z % 2 != 0)
        printf("%d", z);
    else
        printf("error");

    return 0; 
}

该程序正在编译并运行但是给出了错误的答案。对于上面的内容,它给出了&#34;错误&#34;作为输出,但最大的奇数是15。

5 个答案:

答案 0 :(得分:2)

如果它是奇数,你只是打印三个中最大的整数。为了不改变代码,如果您不关心其他值,可以将偶数变量设置为-INF。那就是:

//INF can be whatever big even value you think that works fine (1e9), 0x3ffffffe, etc
#define INF 1e9
if (x % 2 == 0) x = -INF;
if (y % 2 == 0) y = -INF;
if (z % 2 == 0) z = -INF;

//here the rest of your code

答案 1 :(得分:1)

在您的示例中,y是最大的奇数,但它不是最大的数字。 z更大,所以&#34; y&gt; z&#34;计算结果为false,并且不会获取所需的路径。

答案 2 :(得分:0)

代码不会打印最大的奇数,但如果恰好是奇数,则打印最大数字

您需要跟踪您找到的最大奇数,然后打印出来。

例如:

int found = false, largest = 0;

if (x%2 != 0) {
    found = 1;
    largest = x;
}
if (y%2 != 0) {
    found = 1;
    if (y > largest) {
        largest = y;
    }
}
if (z%2 != 0) {
    found = 1;
    if (z > largest) {
        largest = z;
    }
}

if (found) {
    printf("%d", largest);
} else {
    printf("error");
}

答案 3 :(得分:0)

您可能已经注意到您的代码非常重复。本书中的下一个练习很可能是&#34;好的,现在为十个输入数字&#34;执行此操作,这对于考虑来说太繁琐,或者&#34; .. 。任意数量的输入数字&#34;,这显然无法按照您的方式完成。

所以你应该考虑像这样的代码结构:

int current_largest_odd_number = 0; /* note: zero is even */
for (;;) {
    int n = read_a_number();
    if (n == -1) break;  /* read_a_number returns -1 on EOF */
    if (is_even(n)) continue;
    if (n > current_largest_odd_number)
        current_largest_odd_number = n;
}
if (current_largest_odd_number > 0)
    printf("largest odd number: %d\n", current_largest_odd_number);

答案 4 :(得分:0)

当且仅当为奇数时,您的代码才会显示最大的数字。

您可以依次测试每个数字,并将指针更新为最大奇数值(如果有)。

#include <stdio.h>

int main() {
    int x = 11;
    int y = 15;
    int z = 18;
    int *largest = NULL;

    if (x % 2 != 0) {
        largest = &x;
    }
    if (y % 2 != 0) {
        if (!largest || y > *largest) {
            largest = &y;
        }
    }
    if (z % 2 != 0) {
        if (!largest || z > *largest) {
            largest = &z;
        }
    }
    if (largest) {
        printf("%d\n", *largest);
    } else {
        printf("error\n");
    }
    return 0;
}

这是一种替代方法,它使用指示器而不是指示器:

#include <stdio.h>

int main() {
    int x = 11;
    int y = 15;
    int z = 18;
    int largest = 0;
    int found = 0;

    if (x % 2 != 0) {
        largest = x;
        found = 1;
    }
    if (y % 2 != 0) {
        if (!found || y > largest) {
            largest = y;
            found = 1;
        }
    }
    if (z % 2 != 0) {
        if (!found || z > largest) {
            largest = z;
            found = 1;
        }
    }
    if (found) {
        printf("%d\n", largest);
    } else {
        printf("error\n");
    }
    return 0;
}