最大和最小的四个整数(没有数组,没有函数,最少’if’语句)

你看,我自学了C ++(不完全,我还在拖延-_-)。 所以,现在我开始上大学,他们正在教C,他们让我们做了一个输入四个整数的程序,我们必须告诉它们中最大和最小的。 简单,不是吗?

问题是,我已经对函数和数组有了很好的理解。 是的,我可以在arrays中编程,没问题。 但由于这是第一个实验室,我们还没有“学到”那个,所以我不能使用其中的任何一个,它就是非常简单的。

这就是我在那里写的(某种程度上感觉不对)。

#include int main(void) { int first, second, third, fourth; printf("Enter four integers (separated by space): "); scanf("%d %d %d %d", &first, &second, &third, &fourth); if((first>second) && (first>third) && (first>fourth)) printf("\nFirst number is largest"); else if((second>first) && (second>third) && (second>fourth)) printf("\nSecond number is largest"); else if((third>second) && (third>first) && (third>fourth)) printf("\nThird number is largest"); else if((fourth>second) && (fourth>third) && (fourth>first)) printf("\nFourth number is largest"); if((first<second) && (first<third) && (first<fourth)) printf("\nFirst number is smallest"); else if((second<first) && (second<third) && (second<fourth)) printf("\nSecond number is smallest"); else if((third<second) && (third<first) && (third<fourth)) printf("\nThird number is smallest"); else if((fourth<second) && (fourth<third) && (fourth<first)) printf("\nFourth number is smallest"); printf("\n"); return 0; } 

正如您所看到的,它太长,太无聊和复杂。 但是看到我们现在所讨论的所有内容都是循环决策语句 。 这样做有更优雅的方式吗? 一个使用较少的if s ? 并不是说这有什么问题,但可能会更好。

PS这不完全是’家庭作业’或任何东西。 我做了一个程序,我只是想知道我可以做些什么来使它变得更好并学习更好的编程实践。

根据OP的条件

但是看到我们现在所讨论的所有内容都是循环决策语句 。 这样做有更优雅的方式吗? 一个使用较少的if s

只有一个if和一个else if语句和一个for循环可以执行此任务。 简单而简短!

 #include  int main() { int num, max, min; printf ("Enter four numbers: "); scanf ("%d", &num); max = min = num; for (int i = 0; i < 3; i++) { scanf ("%d", &num); if (max < num) max = num; else if (min > num) min = num; } printf ("The smallest and largest of given four numbers are %d and %d respectively.\n", min, max); return 0; } 

做一个“手动” 合并排序 ,或者好吧,只是它的第二位:

从概念上讲,合并排序的工作原理如下

  1. 将未排序的列表分成n个子列表,每个子列表包含1个元素(1个元素的列表被视为已排序)。
  2. 重复合并子列表以生成新的子列表,直到只剩下1个子列表。 这将是排序列表。

合并排序合并步骤图

码:

 int a = 5, b=4, c=7, d=9; int min_ab, min_cd, min; min_ab = a < b ? a : b; min_cd = c < d ? c : d; min = min_ab < min_cd ? min_ab : min_cd; printf("%d", min); 

..和类似的最大。

如果您愿意,可以将三元运算符展开为if (a < b) { min_ab = a; } else { min_ab = b; } if (a < b) { min_ab = a; } else { min_ab = b; } if (a < b) { min_ab = a; } else { min_ab = b; } (分散在多行以便于阅读)。

合并排序的复杂度为O(n*log(n)) ,因此if是s,最多需要O(n*log(n)) (参见关于合并排序的维基百科文章 )。 根据维基百科的说法,“......这些都是比较分类,因此在平均或最差的情况下不能比O(n log n)表现更好”( 来源 ),所以我认为这不应该太过分了。最小数量的if ..虽然你可以尝试看看是否手动执行其他算法之一会产生更少的if s ;-)。

尝试这样的事情

 int main(void) { int a=-2,b=-3,c=-4,d=-5; int max=a,min=a; if(b>max){ max=b; }else if(bmax){ max=c; }else if(cmax){ max=d; }else if(d 

演示

要求同时找到最大和最小的课堂问题的重点是教你从每次比较中提取最有价值的信息。

例如,如果您知道a > b是真的,那么从该单一比较中您应该意识到a不再是最小的候选者,并且不应再参与任何专门用于寻找最小值的比较。 而且,与此同时,你应该意识到b不再是最大的候选者。 使用4个数字,两个测试a > bc > d已经将数字清楚地分成两个独立的类:最大的两个候选者和最小的两个候选者。 其余的很简单。

换句话说,整个想法是使用每次比较提供的信息并行地找到极值,以进一步找到找到最小值和最大值的任务。

 if (first > second) { int t = first; first = second; second = t; } if (third > fourth) { int t = third; third = fourth; fourth = t; } /* Now 'first' and 'third' are candidates for the smallest, while 'second' and 'fourth' are candidates for the largest */ int min = first < third ? first : third; int max = second > fourth ? second : fourth; 

如您所见,这只需要四次比较即可找到这两个数字。

请注意,上面的代码为您提供了最小值和最大值,但它并没有告诉您提供每个值的数字的原始“索引”。 目前尚不清楚是否真的有必要。 您提出的代码示例实现了它,您的问题文本对此没有任何说明。 在任何情况下,更新上述代码以使其“跟踪”数字的来源并不困难。

这很容易,因为数字是a,b,c,d:

 #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) biggest = max (max(a,b), max(c,d)) smallest = min (min(a,b), min(c,d)) 

在这里,你不去,如果声明,没有function(虽然后者是我听过的最愚蠢和有害的要求)。

这是一个没有if或elseif或函数或宏的解决方案,而是使用位移和减法; 只使用一个for循环:

 #include  int main(){ int num , max, min; printf("Enter four numbers: "); scanf("%d", &num); max = min = num; for(int i = 0; i < 3; i++) { scanf("%d", &num); max = max * (1 - ( (max-num) >> 31) ) + num * ( (max-num) >> 31); min = min * (1 - ( (num-min) >> 31) ) + num * ( (num-min) >> 31); } printf("\n%d %d", max, min); return 0; } 

(max-num) >> 31)操作捕获差异的符号,当乘以第二个数字时产生比较的最小值。

这来自于在该语言中有CASE WHEN构造之前几天的旧SQL编码技巧。

一个想法可能是计算前两个数字的最大值和最小值。 然后,您成对比较其余数字。 将每对中较大的一个与当前最大值进行比较,并将每对中较小的一个与当前最小值进行比较。 这样你就可以对每2个元素进行3次比较,这比Arpit的答案稍微有效(每个元素有2次比较)。

在代码中:

 #include  int main(int argc, char **argv) { int a, b, c, d; printf("Enter four integers (separated by space): "); scanf("%d %d %d %d", &a, &b, &c, &d); int max, min; if (a > b) { max = a; min = b; } else { max = b; min = a; } if (c > d) { if (c > max) { max = c; } if (d < min) { min = d; } } else { if (d > max) { max = d; } if (c < min) { min = c; } } printf("max = %d, min = %d\n", max, min); return 0; } 
 int max(int a, int b) { return a > b ? a : b; } int max_of_four(int a, int b, int c, int d) { return max(a, max(b, max(c, d))); } 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; } 

这是C代码只有4个if语句。 它将最大数字移动到d位置并将最小数字移动到某个位置。 值b和c没有在序列中正确排列,但由于需求要求min和max,所以此代码完成了一项工作:

 #include  int main() { int a, b, c, d, temp; printf("Enter four digits: "); scanf("%d %d %d %d", &a, &b, &c, &d); if ( a > b){ temp = a; a = b ; b = temp; } if ( c > d){ temp = c; c = d ; d = temp; } if ( b > d ){ temp = b; b = d; d = temp; } if ( a > c){ temp = a; a = c ; c = temp; } printf("Max %d\nMin %d\n", d, a); return 0; } 
  Please have at the following private int GetLargerValue(int num1, int num2, int num3, int num4) { int largeValue = 0; if (num1 > num2) { if (num1 > num3) largeValue = (num1 > num4) ? num1 : num4; else largeValue = (num3 > num4) ? num3 : num4; } else if (num2 > num3) largeValue = (num2 > num4) ? num2 : num4; else largeValue = (num3 > num4) ? num3 : num4; return largeValue; } 
 int max_of_four(int a, int b, int c, int d){ int res=a; if(b/res) res=b; if(c/res) res=c; if(d/res) res=d; return res; } 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; } 

对于绝对性能,即。 最低比较和分配。

每个级别的注释显示最小值最大值的候选值。 我们的想法是减少每个级别的集合,直到每个集合只有一个项目。 这可以通过4次比较和2次分配来完成。

  // min = abcd // max = abcd if (a <= b) { // min = acd // max = bcd if ( c <= d){ // min = ac // max = bd min = a <= c ? a : c; max = b > d ? b : d; }else{ // min = ad // max = bc min = a <= d ? a : d; max = b > c ? b : c; } } else { // min = bcd // max = acd if ( c <= d){ // min = bc // max = ad min = b < c ? b : c; max = a > d ? a : d; }else{ // min = bd // max = ac min = b < d ? b : d; max = a > c ? a : c; } } 

我看到这个用于循环和if else决策语句的答案,但是我会发布一个我认为会运行得更快并且只使用四个变量的解决方案。 所以这里……

 #include void main() { int a,b,c,d; printf("Enter four numbers of your choice"); scanf("%d%d%d%d",&a,&b,&c,&d); a>b&&a>c?a>d?printf("%d",a):printf("%d" ,d):(b>c&&b>d)?printf("%d",b):c>d?printf("%d", c):printf("%d",d); } 
 #include  

int main(void){

 int int_1, int_2, int_3, int_4; int pair_1_largest = 0, pair_1_smallest = 0; int pair_2_largest = 0, pair_2_smallest = 0; int quartet_largest = 0, quartet_smallest = 0; printf("Example: 15 38 8 21\n"); printf("\nEnter four integers: "); scanf("%d %d %d %d", &int_1, &int_2, &int_3, &int_4); if(int_1 > int_2) { pair_1_largest = int_1; pair_1_smallest = int_2; } else { pair_1_largest = int_2; pair_1_smallest = int_1; } if(int_3 > int_4) { pair_2_largest = int_3; pair_2_smallest = int_4; } else { pair_2_largest = int_4; pair_2_smallest = int_3; } if(pair_1_largest > pair_2_largest) quartet_largest = pair_1_largest; else quartet_largest = pair_2_largest; if(pair_1_smallest < pair_2_smallest) quartet_smallest = pair_1_smallest; else quartet_smallest = pair_2_smallest; printf("The largest number is: %d\n", quartet_largest); printf("The smallest number is: %d\n", quartet_smallest); return 0; 

}

大家好! 我是编程的初学者,所以不要对我很苛刻:) KN King的“Native C Programming”很有帮助!