我一直在阅读推荐的初学者书籍中的一些基本练习:C 编程:现代方法(第 2 版)
问题指出:使用尽可能少的 if 语句来确定用户输入的四个数字中的最大和最小。四个 if 语句就足够了。-- 因为这个问题是在本书介绍循环、数组和函数之前提出的,所以我假设不应该使用这些。
另外,我知道有一个与此类似的问题,但是没有一个符合我想要达到的要求。
if语句我想到的第一件事是使用逻辑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语句的要求。我想知道是否可以进一步缩短我的代码。请原谅这个问题的基本性质。任何建议,将不胜感激。
我们可以使用分而治之的方法来解决这个问题。
想象一下我们的输入 = [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)