2021秋-实验5-一维数组 7-1 交换最小值和最大值
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
结尾无空行
输出样例:
1 2 5 4 8
结尾无空行
一开始我的代码:
int main() { int i,n,flagmax=1,flagmin=1,t;//用以记录最大和最小值的位置 int a[11]; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[flagmin]>a[i]) flagmin=i; if(a[flagmax]<a[i]) flagmax=i;//比较,更新 } t=a[flagmin]; a[flagmin]=a[1]; a[1]=t;//依题意,先交换最小值与第一个数 t=a[flagmax]; a[flagmax]=a[n]; a[n]=t;//再交换最大值与最后一个数 for(i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
然而,当我输入样例时,却出现下面的结果(感谢老师出的这个特殊样例)
因为在这列数中,最大值恰好处于首位。第一次交换时,最大值的位置被移动了,不再是我记录的flagmax处。
既然问题找到了,那我就直接遍历两遍,即第一次交换后,再遍历一次,寻找并记录最大值,之后进行第二次交换。
顺便写了个交换数的函数。
第二次的代码(已AC):
void Swap(int *m,int *n) { int t; t=*m; *m=*n; *n=t; } int main() { int i,n,flagmax=1,flagmin=1; int a[11]; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[flagmin]>a[i]) flagmin=i; } Swap(&a[1],&a[flagmin]); for(i=1;i<=n;i++) if(a[flagmax]<a[i]) flagmax=i; Swap(&a[n],&a[flagmax]); for(i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
也许还有可以简化的地方,下次再谈。