一、题目描述
循环输入。每组输入数据为三个整数 a , b , c ( a , b , c ≤ 1 0 9 ) ,输出它们排序后的值,以空格分隔。当没有任何输入时,程序结束。
方法:
(1)先自定义一个交换函数,用于后面交换数字,这里需要用地址传递,才可以改变实参
(2)先判断a>b,若成立则交换a与b的地址,这样我们就可以保证a与b是从小到大排序的
(3)再判断b>c,若成立则交换b与c 的地址,这样我们就可以保证c是三个数中最大的数
(3)此时因为b可能与c交换过,所以我们不确定a与b的关系,于是再进行一次a>b的判断,若成立,则交换,这样就能保证a<b<c了
代码如下:
#include "stdio.h"
int swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int a,b,c;
while(scanf("%d %d %d", &a, &b, &c) != EOF)
{
if(a > b) swap(&a, &b);
if(b > c) swap(&b, &c);
if(a > b) swap(&a, &b);
printf("%d %d %d\n", a, b, c);
}
return 0;
}
二、课后习题
1.题目
方法:
(1)先让数组从小到大排序
(2)利用while循环删去数组中重复的数字
(3)进行讨论,分为元素数量大于等于3和元素数量小于3
(4)分不同情况返回不同的值,即可
代码如下:
int cmp(const void *a,const void *b){
return *(int*)a>*(int*)b; //大于就是升序排列,小于就是降序排列
}
int thirdMax(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp); //API排序
int i=1;
int j=1;
while(j<numsSize){ //删去数组中重复的数字
if(nums[j]!=nums[i-1]) //后一个数与前一个数是否相同,否,则进入,是,则直接
{
nums[i]=nums[j]; //令后一个与前一个不相同的数放入数组中
i++;
}
j++;
}
if(i==1 || i==2) return nums[i-1]; //若只有两个/一个元素,则返回下标为i-1的数,即最大的数
return nums[i-3]; //反之则,返回下标为i-3的数,即,第三大的数
}
力扣截图