如何从逻辑层面去分析三个数字比较大小的问题。
背景(PTA天梯赛集锦):
本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
相信大家看到这个题目时的第一想法都是,我直接排序就好了。的确,排序是这类问题的通解,任意一个排序算法都可以将这道题完美解决。但是博主看到题目中只有三个数字,于是便放弃了排序的念头,想从另一个方向入手去解决这个问题。于是,经过博主的一番分析,觉着我们按照下面的方法去理解会使得逻辑比较清晰,并且算法稳定。下面就让我谈一谈如何用一个合理的逻辑去描述它。
思路:
首先,我们从两个数字比较大小来说。假如给了你两个数字 a , b a,b a,b ( a ≠ b a \neq b a̸=b)让你去比较大小,这个很简单啊。计算机也可以很快的给出结果。如果这个时候突然加入了一个数字 c c c。这时候我们对三个数字 a , b , c a,b,c a,b,c进行排序 。
不妨这样想一想,我们在三个数字中随便拿出来两个数字 a , b a,b a,b,他们的大小次序是一定的(假如: a > b a > b a>b)。我们无非就是想知道剩下的数字 c c c放到哪里的问题。这样一想就很简单了。如果 c > a c > a c>a那么就把 c c c放到 a a a的右边,所以得到的次序就是这样的:
c > a > b c > a > b c>a>b
其他情况同理。
代码阐述:
#include <cstdio>
using namespace std;
int main(){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int first = a>=b?1:0;
int second = a>=c?1:0;
int third = b>=c?1:0;
if(third && first){
printf("%d->%d->%d",c,b,a);
}else if(third && second && !first){
printf("%d->%d->%d",c,a,b);
}else if(third && !second){
printf("%d->%d->%d",a,c,b);
}else if(!third && second){
printf("%d->%d->%d",b,c,a);
}else if(!third && !second && first){
printf("%d->%d->%d",b,a,c);
}else if(!third && !first){
printf("%d->%d->%d",a,b,c);
}
}