玩转C语言(三):如何只使用printf和scanf排列三个整数

从这篇博客开始,我将以快乐的视角分享我遇到的C语言的题目。也是从此开始,我将这个专栏更名为“玩转C语言”。

1. 机缘巧合

在今天下午,一个帅气的同学找我,说能不能帮我看看如何不用if,将三个int变量进行排序啊!我第一反应,emmm,是不是你听错了呀?此刻,他把这道题的图片发给了我。放眼望去,嗯,事情没我想得那么简单。一个个显眼的要求,

  • with only 3 Variables ,
  • not permitted to use if statements ,
  • not permitted to use loops ,
  • not permitted to call functions other than printf and scanf ,
  • not permitted to use functions from the math library
  • not permitted to use printf inside expressions, only use printf as a statement
  • not permitted to assign variables inside expressions, only assign variables as a statement

我的天啊,这都是啥呀,我只好硬着头皮答应了他。心里发慌,,没干过这大事情啊。

2. 灵感来临

说来也是巧,就在我低头的一刹那,a?b:c这个表达式出现在了我的脑子里面。我就有了想法,

思路:
先将a与b进行比较,取最大,然后再将a与c比较取最大,再将两个结果比较取最大,好了,搞定最大值!
同理,通过都取最小,搞定最小值!

那我怎么比较才能出来中间值啊,不定顺序的三个输入的整数,有点难办。3个数?3个数!!!只有三个数,我都出来两个了,我何苦要比出来第三个呢!!

思路Plus:
将输入的三个数加和,再减去剩下的两个值不就ok了吗!!!!

好嘞,思路有了,开始动手!

3. 代码实现

#include <stdio.h>

int main() {
    int firstNum,secondNum,thirdNum;
    printf("请输入三个整数:");
    scanf("%d%d%d", &firstNum, &secondNum, &thirdNum);
    printf("从大到小:");
    //最大值
    printf("%d ", (((firstNum > secondNum) ? firstNum : secondNum) > ((firstNum > thirdNum) ? firstNum : thirdNum)) ? ((firstNum > secondNum) ? firstNum : secondNum) : ((firstNum > thirdNum) ? firstNum : thirdNum));
    //中间值
    printf("%d ", (firstNum + secondNum + thirdNum) - ((((firstNum > secondNum) ? firstNum : secondNum) > ((firstNum > thirdNum) ? firstNum : thirdNum)) ? ((firstNum > secondNum) ? firstNum : secondNum) : ((firstNum > thirdNum) ? firstNum : thirdNum)) - ((((firstNum < secondNum) ? firstNum : secondNum) < ((firstNum < thirdNum) ? firstNum : thirdNum)) ? ((firstNum < secondNum) ? firstNum : secondNum) : ((firstNum < thirdNum) ? firstNum : thirdNum)));
    //最小值
    printf("%d\n", (((firstNum < secondNum) ? firstNum : secondNum) < ((firstNum < thirdNum) ? firstNum : thirdNum)) ? ((firstNum < secondNum) ? firstNum : secondNum) : ((firstNum < thirdNum) ? firstNum : thirdNum));
    return 0;
}

咦!舒服了!搞定!
没有报错,测试一下。

4. 暴力测试

既然是三个数排序,那就这样吧

测试10 0 0
测试21 2 3
测试31 3 2
测试42 1 3
测试52 3 1
测试63 1 2
测试73 2 1

通过测试这7组用例,不错不错,全部通过,Over收工!

发布了16 篇原创文章 · 获赞 11 · 访问量 1126

猜你喜欢

转载自blog.csdn.net/bjtu_linxinyu/article/details/104732619