本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。 注意:题目保证最大和最小值都是唯一的。
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
5 1 2 5 4 8
原本我是这样认为:先遍历,录入所有数字至数组,找出最大值与最小值,并对最大最小时的数组位置做标记(t1,t2),最后使之交换即可,于是: 以下的最近代码是错的!!! 以下的是错的!!! 以下的是错的!!!
#include<stdio.h> int main(){ int n,i,t,t1,t2,min,max; scanf("%d",&n); int a[n]; for(i=0;i<n;i++){//input scanf("%d",&a[i]); } max=min=a[0];//注意初始化。 for(i=0;i<n;i++){//do if(a[i]>=max){ t1=i;//record the max i; max=a[t1]; }else if(a[i]<=min){ t2=i;//record the min i; min=a[t2]; } } //swap min; t=a[0]; a[0]=a[t2]; //只更换最大最小值正确,而两者合并执行则错误。 a[t2]=t; //swap max; /* for(i=0;i<n;i++){//do if(a[i]>=max){ t1=i;//record the max i; max=a[t1]; }} *///以上for做的是初始化,问题出在最大最小值的i及位置在转换后发生了变动,所以需要重新找到max的i; t=a[n-1]; a[n-1]=a[t1]; a[t1]=t; for(i=0;i<n;i++){//output printf("%d ",a[i]); } return 0; }在我一番挣扎后发现只要只交换最大或最小值,那么就正确,但如果两者同时就尴尬了,其实是因为在交换位置后i值及他们在数组中的i变了所以要重新找到最大(最小)的位置,一次只做一个交换,将其换位。详见如下:
当然,代码是直接改的,有些杂乱。。
在做题中还遇到了出现一些奇妙的数字(不应出现在输出中的),查明原因是t的之没有初始化,所以要记得初始化。以免出现奇妙的问题。