本题要求将输入的任意3个整数从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个整数从小到大输出,其间以“->”相连。
输入样例:
4 2 8
输出样例:
2->4->8
思路一:比较交换法
通过多次比较和交换,逐步将三个数调整为从小到大的顺序。先比较前两个数,把较小的放在前面,再依次和第三个数比较、交换。
思路:将输入的三个整数
a
、b
、c
按从小到大的顺序排序,然后按照指定格式输出。具体步骤如下:
- 输入读取:使用
cin
从标准输入读取三个整数a
、b
、c
。- 初步比较与交换(a 和 b):
- 通过
if (a > b)
判断语句,检查a
是否大于b
。如果是,就利用一个临时变量temp
,先把a
的值暂存起来,再将b
的值赋给a
,最后把暂存的a
原值赋给b
。经过这一步,a
和b
中较小的值就存放在a
里了。- 二次比较与交换(a 和 c):
- 接着,
if (a > c)
语句判断此时较小的a
是否大于c
。若成立,同样借助临时变量temp
,把a
与c
的值进行交换,确保a
是三者中最小的数。- 第三次比较与交换(b 和 c):
- 最后,
if (b > c)
用来判断剩下的两个数b
和c
的大小关系。如果b
大于c
,再次使用临时变量temp
交换它们的值,使得b
小于等于c
。- 输出结果:经过上述三次比较和交换,
a
、b
、c
已经按从小到大的顺序排列好了,使用cout
按照a -> b -> c
的格式输出这三个数。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
// 先比较 a 和 b
if (a > b) {
int temp = a;
a = b;
b = temp;
}
// 再让较小的 a 和 c 比较
if (a > c) {
int temp = a;
a = c;
c = temp;
}
// 最后比较 b 和 c
if (b > c) {
int temp = b;
b = c;
c = temp;
}
cout << a << "->" << b << "->" << c << endl;
return 0;
}
思路二:利用数组排序
将三个数存入数组,使用 std::sort
函数对数组排序,再按格式输出。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int nums[3];
cin >> nums[0] >> nums[1] >> nums[2];
sort(nums, nums + 3);
cout << nums[0] << "->" << nums[1] << "->" << nums[2] << endl;
return 0;
}
思路三:找最小值法
先找出三个数中的最小值,输出,再从剩下两个数中找较小值输出,最后输出最大的数。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int minVal = a;
if (b < minVal) {
minVal = b;
}
if (c < minVal) {
minVal = c;
}
cout << minVal << "->";
if (minVal == a) {
minVal = b < c? b : c;
} else if (minVal == b) {
minVal = a < c? a : c;
} else {
minVal = a < b? a : b;
}
cout << minVal << "->";
if (a > b) {
if (a > c) {
cout << a << endl;
} else {
cout << c << endl;
}
} else {
if (b > c) {
cout << b << endl;
} else {
cout << c << endl;
}
}
return 0;
}
思路四:条件表达式嵌套
利用条件表达式层层嵌套来确定三个数的大小顺序,代码较为紧凑但可读性稍差。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
int x = (a < b? (a < c? a : (b < c? b : c)) : (b < c? b : (a < c? a : c)));
int z = (a > b? (a > c? a : (b > c? b : c)) : (b > c? b : (a > c? a : c)));
int y = a + b + c - x - z;
cout << x << "->" << y << "->" << z << endl;
return 0;
}
寻找最小值
x
:
- 代码
(a < b? (a < c? a : (b < c? b : c)) : (b < c? b : (a < c? a : c)))
通过嵌套的三元条件运算符来确定最小值。- 先比较
a
和b
:如果a < b
,接着比较a
和c
,若a < c
,说明a
最小;否则在b
和c
中选较小的那个作为最小值。要是a >= b
,则在b
和c
中先比较大小,再与a
对比,从而找出最小值,最终将其赋值给x
。寻找最大值
z
:
- 表达式
(a > b? (a > c? a : (b > c? b : c)) : (b > c? b : (a > c? a : c)))
也是利用嵌套三元条件运算符来找出最大值。- 先看
a
和b
的大小关系:若a > b
,继续比较a
和c
,a
更大就取a
,否则在b
和c
里取较大值;若a <= b
,就在b
和c
比较之后,再结合a
确定最大值,最后把最大值赋给z
。计算中间值
y
:
- 已知三个数的总和是
a + b + c
,既然已经找出了最小值x
和最大值z
,那么用总和减去最小值与最大值,即y = a + b + c - x - z
,得到的结果就是中间值。输出结果:
- 按照从小到大的顺序,将
x
、y
、z
用cout
输出,中间用->
连接,格式为x -> y -> z
。这种方法没有使用临时变量来交换值,而是借助数学运算与条件判断直接得出排序后的结果。
思路五:借助临时变量与逻辑判断
先将三个数中最小的放到第一个变量位置,接着在剩下两个数里找出较小的放到第二个变量位置,最后输出。
#include <iostream>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
// 先找出最小的放到 a
if (b < a) {
if (c < b) {
int temp = a;
a = c;
c = temp;
} else {
int temp = a;
a = b;
b = temp;
}
} else if (c < a) {
int temp = a;
a = c;
c = temp;
}
// 再处理剩下两个数
if (c < b) {
int temp = b;
b = c;
c = temp;
}
cout << a << "->" << b << "->" << c << endl;
return 0;
}