【问题标题】:Second Largest Number (of 3/4 numbers) using Ternary Operator in C?在 C 中使用三元运算符的第二大数(3/4 数)?
【发布时间】:2015-10-27 15:30:46
【问题描述】:

网上所有的三元算子例子都只有求最大数的方法。

是否可以设计一个代码来使用三元运算符找到 3 或 4 数字中的第二大数?

【问题讨论】:

  • 您不必为提问找借口。直奔主题:-)
  • 是的;这不是特别容易,但也不是特别难。你尝试了什么?您如何描述手动过程?数字是如何存储的(数组或单独的变量)?您可以修改变量,还是必须保持不变?你需要 3 个还是 4 个?

标签: c numbers ternary-operator


【解决方案1】:

我不认为使用三元运算符获得第二大数有什么过分聪明的技巧。但是你可以利用三元运算来获得最小的数:

int min(int a, int b) {
    return (a < b)? a : b;
}


int secondLargest(int a, int b, int c) {
    return (a < b && a < c)? min(b, c) : 
           (b < a && b < c)? min(a, c) :
                             min(a, b);
}

对于 4 个数字,我们可以使用之前定义的函数:

int secondLargest(int a, int b, int c, int d) {
    int minVar = (min(a, b), min(c, d))
    return a == minVar? secondLargest(b, c, d) :
           b == minVar? secondLargest(a, c, d) :
           c == minVar? secondLargest(a, b, d) :
                        secondLargest(a, b, c) :
}

对于任意数量的变量,您可以保持这一点,但在某些时候,将它们排序在一个数组中然后读出倒数第二个条目会更有意义。

【讨论】:

    【解决方案2】:

    您可以使用以下三元运算符获得 3 个数字中的第二大数字(abc):

    int x = (a >= b && a >= c) ? ((b >= c) ? b : c) : 
        ((b >= c) ? ((a >= c) ? a : c) : ((a >= b) ? a : b));
    

    我们的想法是找出最大的,然后选择其他两个中最大的 - 除了所有三个中的最大值之外的最大值。

    在上面,如果a最大(大于bc),(a &gt;= b &amp;&amp; a &gt;= c)将为true...如果是,则结果为((b &gt;= c) ? b : c),这给出了bc 中的较大者。

    如果a 不是最大的,我们评估((b &gt;= c) ? ((a &gt;= c) ? a : c) : ((a &gt;= b) ? a : b))。在那,(b &gt;= c) 检查b 是否是三个中最大的(我们已经知道a 不是,所以我们只比较bc)......如果b 是三者中最大的,我们使用((a &gt;= c) ? a : c) 来获得最大的ac

    如果ab 都不是最大的,那么c 必须是...所以我们评估((a &gt;= b) ? a : b) 以获得最大的ab

    同样的模式可以扩展到四个数字而不是三个......但即使是三个数字也会变得很长,使用(可能是内联的)函数和更直接的方法可能会更有意义。

    【讨论】:

      猜你喜欢
      • 2013-09-11
      • 2012-04-02
      • 1970-01-01
      • 2020-11-23
      • 2011-12-27
      • 1970-01-01
      • 2016-04-13
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多