我一直在阅读推荐的初学者书中的一些基本练习:C Programming: A Modern Approach (2nd Edition)
问题陈述:使用尽可能少的if语句来确定用户输入的四个数字中的最大和最小数字。 四个if语句就足够了。 - 由于在循环之前询问了这个问题,本书中介绍了数组和函数,我假设不应该使用这些。
另外,我知道这个版本有question,但没有一个符合我想要达到的要求。
if
语句我首先想到的是使用逻辑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
语句的要求。我想知道我是否可以进一步缩短我的代码。请原谅这个问题的基本性质。任何建议将不胜感激。
答案 0 :(得分:4)
我们可以使用分而治之的方法来解决这个问题。
想象一下我们的输入= [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;
}
答案 1 :(得分:3)
以下应该工作。
它使用前2个max1 = max(a, b)
来计算max2 = max(c, d)
和min1 = min(a, b)
,以及min2 = min(c, d)
和if
。
然后最大值等于max(max(a, b), max(c, d)) = max(max1, max2)
。 (第3个if
。)
最小值等于min(min(a, b), min(c, d)) = min(min1, min2)
。 (第4个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
s。
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);
答案 2 :(得分:0)
#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;
}
答案 3 :(得分:-1)
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