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

rkttyhzu  于 2023-01-25  发布在  其他
关注(0)|答案(6)|浏览(223)

我一直在做一本推荐的初学者读物中的一些基本练习:C Programming: A Modern Approach (2nd Edition)
该问题指出:使用尽可能少的if语句来确定用户输入的四个数字中的最大值和最小值。四个if语句就足够了。--由于这个问题是在本书涉及循环、数组和函数之前提出的,所以我假设不应该使用这些。
此外,我知道有一个类似的question到这一个,但没有一个满足我试图实现的要求。
1.仅使用4if语句
1.没有for循环。
我想到的第一件事是使用逻辑or操作符,但是如下所示,使用了8个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;

接下来,我继续使用下面的代码,这将是一个更好的解决方案:

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;

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

zxlwwiss

zxlwwiss1#

我们可以用分治的方法来解决这个问题。
想象我们的输入= [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.

附加(如何在C语言中交换数字)

void swap(int *a,int *b) {
    int c = *a;
    *a = *b;
    *b = c;
}
3b6akqbq

3b6akqbq2#

下面应该工作。
它使用前2个if来计算max1 = max(a, b)max2 = max(c, d),以及min1 = min(a, b)min2 = min(c, d)
则最大值等于max(max(a, b), max(c, d)) = max(max1, max2)(第三个if)。
最小值等于min(min(a, b), min(c, d)) = min(min1, min2)(第四个if)。

int a, b, c, d;

// ...

int min, max, max1, max2, min1, min2;

if (a > b) // 1
{
    max1 = a;
    min1 = b;
}
else
{
    max1 = b;
    min1 = a;
}

if (c > d) // 2
{
    max2 = c;
    min2 = d;
}
else
{
    max2 = d;
    min2 = c;
}

if (max1 > max2) // 3
    max = max1;
else
    max = max2;

if (min1 < min2) // 4
    min = min1;
else
    min = min2;

奖金

if秒。

int a, b, c, d;

// ...

int min = a, max = a;
b < min && (min = b);
c < min && (min = c);
d < min && (min = d);
b > max && (max = b);
c > max && (max = c);
d > max && (max = d);
vvppvyoh

vvppvyoh3#

#include <stdio.h>

int main ()
{
    int num1, num2, num3, num4;
  
     printf("enter the numbers: ");
     scanf("%d %d %d %d", &num1, &num2, &num3, &num4);

     int large1 = num1, low1 = num2, low = num3, large = num4;
     if (num1 <= num2) {
         large1 = num2;
         low1 = num1;
     }
     if (num3 >= num4) {
         large = num3;
         low = num4;
     }
     if (large < large) {
         large = large1;
     }
     if (low > low1) {
         low = low1;
     }
     printf("%d\n", large);
     printf("%d\n", low);
     return 0;
}
olmpazwi

olmpazwi4#

#include <stdio.h>

int max_of_four(int a,int b, int c, int d)
{
    int max=0;
    max = (a > b ? (a > c ? (a > d ?   a :  d) :  (c > d ? c : d) ) : (b > c ? (b > d ? b : d>c? d : c ) : c>d? c : d)) ;

   return max;
}

int main() {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    int ans = max_of_four(a, b, c, d);
    printf("%d", ans);

    return 0;
}
5w9g7ksd

5w9g7ksd5#

下面是使用单个if语句的替代解决方案:

#include <stdio.h>

int main() {
    int a, b, c, d;
  
    printf("enter the numbers: ");
    if (scanf("%d%d%d%d", &a, &b, &c, &d) == 4) {
        int lo1 = a * (a <= b) + (a > b) * b;
        int hi1 = a * (a >= b) + (a < b) * b;
        int lo2 = c * (c <= d) + (c > d) * d;
        int hi2 = c * (c >= d) + (c < d) * d;
        int lo = lo1 * (lo1 <= lo2) + (lo1 > lo2) * lo2;
        int hi = hi1 * (hi1 >= hi2) + (hi1 < hi2) * hi2;
        printf("%d %d\n", hi, lo);
        return 0;
    } else {
        return 1;
    }
}
gc0ot86w

gc0ot86w6#

这是一个很有创造性的问题。我只用了两个if语句就解决了你的问题。

int a = 22, b = 25, c = 100, d = 4;
        int max = 0, min = 0;
        if ((a > b ? (a > c ? (a > d ? max = a : max = d) : max = c) : (b > c ? (b > d ? max = b : max = d) : max = c)) == 1)
        {
              //Control never goes inside this loop
        }
        else if ((a < b ? (a < c ? (a < d ? min= a : min= d) : min= c) : (b < c ? (b < d ? min = b : min = d) : min = c)) == 1)
        {
             //Control never goes inside this loop
        }
        printf("Maximum Value is:%d and Minimum Value is: %d", max, min);//at this statement max and min will have appropriate values

相关问题