仅使用 4 个“if”语句 - 查找 4 个整数中的最大和最小

2 c if-statement

我一直在阅读推荐的初学者书籍中的一些基本练习:C 编程:现代方法(第 2 版)

问题指出:使用尽可能少的 if 语句来确定用户输入的四个数字中的最大和最小。四个 if 语句就足够了。-- 因为这个问题是在本书介绍循环、数组和函数之前提出的,所以我假设不应该使用这些。

另外,我知道有一个与此类似的问题,但是没有一个符合我想要达到的要求。

  1. 使用4 条if语句
  2. 没有 for 循环。

我想到的第一件事是使用逻辑or运算符,但是如下所示,使用了八个if语句。这种方法也很长而且效率不高:

    int a, b, c, d;

printf("Enter 4 intgeres to find largest and smallest: ");
scanf_s("%d %d %d %d", &a, &b, &c, &d);

if (a > b && a > c && a > d)
    printf("Largest: %d\n", a);
if (b > a && b > c && b > d)
    printf("Largest: %d\n", b);
if (c > a && c > b && c > d)
    printf("Largest: %d\n", c);
if (d > a && d > a && d > c)
    printf("Largest: %d\n", d);

if (a < b && a < c && a < d)
    printf("Smallest: %d\n", a);
if (b < a && b < c && b < d)
    printf("Smallest: %d\n", b);
if (c < a && c < b && c < d)
    printf("Smallest: %d\n", c);
if (d < a && d < a && d < c)
    printf("Smallest: %d\n", d);

return 0;
Run Code Online (Sandbox Code Playgroud)

接下来,我继续执行以下代码,这将是一个更好的解决方案:

    int a, b, c, d;

printf("Enter 4 intgeres to find largest and smallest: ");
scanf_s("%d %d %d %d", &a, &b, &c, &d);

int max = a, min = a;

if (b > max) 
    max = b;
else if (b < min) 
    min = b;
if (c > max) 
    max = c;
else if (c < min) 
    min = c;
if (d > max) 
    max = d;
else if (d < min) 
    min = d;

printf("max: %d min : %d\n", max, min);

return 0;
Run Code Online (Sandbox Code Playgroud)

但是,仍然不满足使用4个if语句的要求。我想知道是否可以进一步缩短我的代码。请原谅这个问题的基本性质。任何建议,将不胜感激。

alg*_*ava 5

我们可以使用分而治之的方法来解决这个问题。

想象一下我们的输入 = [a, b, c, d]

我们想从 [a,b] 和 [c,d] 中找到答案

然后合并最终解决方案以找到答案。

if(a > b) swap(&a,&b); // solve [a,b]
if(c > d) swap(&c,&d); // solve [c,d]
if(a > c) swap(&a,&c); // find minimum from [a,b] and [c,d]
if(d > b) swap(&b,&d); // find maximum from [a,b] and [c,d]

// a will store the minimum value.
// b will store the maximum value.
Run Code Online (Sandbox Code Playgroud)

奖金(如何在 C 语言中交换数字)

void swap(int *a,int *b) {
    int c = *a;
    *a = *b;
    *b = c;
}
Run Code Online (Sandbox Code Playgroud)