三数论大小(指针)
题目描述
输入三个整数,然后按照从大到小的顺序输出数值。
要求:用三个指针分别指向这三个整数,排序过程必须通过这三个指针来操作,不能直接访问这三个整数
输出时,必须使用这三个指针,不能使用存储三个整数的变量
输入
第一行输入t表示有t个测试实例
第二行起,每行输入三个整数
输入t行
输出
每行按照从大到小的顺序输出每个实例
输入样例
3
2 4 6
88 99 77
111 333 222
输出样例
6 4 2
99 88 77
333 222 111
#include<iostream>
using namespace std;
/*题目:三数比大小,从大到小输出*/
//思路类似冒泡排序:大的数交换
int main() {
int num;
cin >> num;
while (num--) {
int a, b, c; //a,b,c为输入的三个数
cin >> a >> b >> c;
int* pa = &a, * pb = &b, * pc = &c; //pa,pb,pc分别指向最大的数,假设为输入的数最大
if (*pa < *pb) { //如果a比b小,则指针位置互换
pa = &b;
pb = &a;
}
if (*pa < *pc) {
pc = pa;
pa = &c; //注意两语句不可以交换
}
if (*pb < *pc) {
int* t = pb;
pb = pc;
pc = t;
}
cout << *pa << " " << *pb << " " << *pc << endl;
}
}
题目分析与扩展
三数论大小,应该算是最经典的c语言题目,也是新手入门c语言第一课。
- 如果只是要找出最大的数,我们可以简单的使用三目运算符:
#include<stdio.h>
#pragma warning(disable:4996) //vs需要屏蔽内存越界检查
int main()
{
int a,b,c,max;
scanf("%d %d %d",&a,&b,&c);
a>b?max=a:max=b;
c>max?max=c:;
printf("%d",max);
}
- 如果是要从大到小排列:
我们最先想到的也是逻辑最简单的 if else 分支判断:
#include<stdio.h>
int main()
{
int a,b,c,max;
scanf("%d %d %d",&a,&b,&c);
if(a>b&&a>c&&b>c)
{
printf("%d->%d->%d",c,b,a);
}
else if(a>b&&a>c&&b<c)
{
printf("%d->%d->%d",b,c,a);
}
else if(b>a&&b>c&&a<c)
{
printf("%d->%d->%d",a,c,b);
}
else if(b>a&&b>c&&a>c)
{
printf("%d->%d->%d",c,a,b);
}else if(c>a&&c>b&&b<a)
{
printf("%d->%d->%d",b,a,c);
}else if(c>a&&c>b&&b>a)
{
printf("%d->%d->%d",a,b,c);
}
return 0;
}
当然,这样的代码非常不美观。于是后面随着我们的学习,我们又有几种几种经典的排序方法:
类似冒泡排序,同理可以用指针写更方便(见上文)
#include <iostream>
using namespace std;
int swap(int* pa, int* pb) {
int tmp = *pa;
*pa = *pb;
*pb = tmp;
return 0;
}
int sort(int* pa, int* pb, int* pc) {
if (*pa < *pb)swap(pa, pb);
if (*pa < *pc)swap(pa, pc);
if (*pb < *pc)swap(pb, pc);
return 0;
}
int main()
{
int t;
cin >> t;
while (t--) {
int a, b, c;
cin >> a >> b >> c;
int* pa = &a, * pb = &b, * pc = &c;
sort(pa, pb, pc);
cout << *pa <<" " << *pb <<" " << *pc;
}
}