在C中使用三元运算符的第二大数(3/4数)?

时间:2015-08-05 02:51:54

标签: c numbers ternary-operator

三元运营商在线的所有示例都只有找到最大数字的方法。

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

2 个答案:

答案 0 :(得分:0)

我认为使用三元运算符获得第二大数字并不是一个过于聪明的技巧。但您可以使用三元运算来获得最小的数字:

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) :
}

你可以为任意大量的变量保留这些变量,但在某些时候,在数组中对它们进行排序然后读出倒数第二个条目会更有意义。

答案 1 :(得分:0)

您可以使用三元运算符获得3个数字中的第二个(protected LoginPackage preLogin() throws BankException, IOException { urlopen = new Urllib(context, CertificateReader.getCertificates(context, R.raw.cert_okq8)); Date d = new Date(); List<NameValuePair> postData = new ArrayList<NameValuePair>(); response = urlopen .open("https://nettbank.edb.com/Logon/index.jsp?domain=0066&from_page=http://www.okq8.se&to_page=https://nettbank.edb.com/cardpayment/transigo/logon/done/okq8"); //p_tranid is the epoch time in milliseconds postData.add(new BasicNameValuePair("p_tranid", Long.toString(d.getTime()))); postData.add(new BasicNameValuePair("p_errorScreen", "LOGON_REPOST_ERROR")); postData.add(new BasicNameValuePair("n_bank", "")); postData.add(new BasicNameValuePair("empty_pwd", "")); postData.add(new BasicNameValuePair("user_id", getUsername().toUpperCase())); postData.add(new BasicNameValuePair("password", getPassword())); return new LoginPackage(urlopen, postData, response, "https://nettbank.edb.com/Logon/logon/step1"); } ab),如下所示:

c

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

在上文中,如果a是最大的(大于int x = (a >= b && a >= c) ? ((b >= c) ? b : c) : ((b >= c) ? ((a >= c) ? a : c) : ((a >= b) ? a : b)); (a >= b && a >= c)),b为真 ...如果是,则结果为c,其中((b >= c) ? b : c)b的较大者。

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

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

相同的模式可以扩展到四个数而不是三个......但即使有三个数也会变得很长,而且使用一个(可能是内联的)函数并使用更简单的方法可能更有意义。< / p>