9:交换最小值和最大值
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
作者 C课程组
单位 浙江大学
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
#include<stdio.h>
static int c;
int main()
{
int n,a[10],i,b[10],t;
scanf("%d",&n);
for(i=0;i<n;i++){scanf("%d",&a[i]);b[i]=a[i];}
for(i=1;i<n;i++){if(b[0]>b[i]) {t=b[0];b[0]=b[i];b[i]=t;} }
for(i=0;i<n;i++){if(b[0]==a[i]) {c=i;} }
t=a[0]; a[0]=a[c]; a[c]=t;
for(i=1;i<n;i++){if(b[0]<b[i]) {t=b[0];b[0]=b[i];b[i]=t;} }
for(i=0;i<n;i++){if(b[0]==a[i]) {c=i;} }
t=a[n-1];a[n-1]=a[c];a[c]=t;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
#include<stdio.h>
int main(){
int N,i,t,a[10];
scanf("%d",&N);
for(i=0;i<N;i++) { scanf("%d",&a[i]); }
int min=0; /*先假设min值下标为0*/
for(i=1;i<N;i++) { /*然后从下标1开始依次和下标min比较大小*/
if(a[i]<a[min]) /*如果a[i]<a[]min,就把i赋值于min*/
min=i; /*用min来存最小值的小标*/
} /*通过上面语句找出最小值a[min]*/
t=a[0]; /*把数组的第一值啊a[0]赋值于t*/
a[0]=a[min]; /*再把最小值啊a[min]赋值于a[0],这样第一个数就是最小值啦*/
a[min]=t; /*然后在把之前存放在t的数组第一个值赋值与a[min]*/
/*通过上面的三条语句就实现交换啦*/
int max=0;
for(i=1;i<N;i++) {if(a[i]>a[max]) max=i; }
t=a[N-1];
a[N-1]=a[max];
a[max]=t; /*关于最大值交换同上*/
for(i=0;i<N;i++) { printf("%d ",a[i]); }
return 0;
}
#include<stdio.h>
int main()
{
int N,i,min,max,lim,z;
scanf("%d",&N);
int s[N];
for(i=0;i<N;i++){ scanf("%d",&s[i]); }
min=s[0]; max=s[0];
for(i=1;i<N;i++){ if(s[i]>max) max=s[i]; if(s[i]<min) min=s[i]; } /*找到最大值和最小值*/
for(i=1;i<N;i++)
{if(s[i]==min) {lim=s[0]; s[0]=s[i]; s[i]=lim; break; } }/*确定最小值位置并与第一个元素交换*/
for(i=1;i<N;i++)
{if(s[i]==max) {lim=s[N-1]; s[N-1]=s[i]; s[i]=lim;} } /*找到最大值并与最后一个元素交换*/
printf("%d",s[0]);
for(i=1;i<N;i++)
{ printf(" %d",s[i]); } /*输出*/
printf(" ");
return 0;
}
#include<stdio.h>
void swap(int v[], int i, int j);
int main() {
int a[15], i, n, mini, maxi;
scanf("%d", &n);
mini = maxi = 0;
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
if (a[i] < a[mini])
mini = i; //找到最小值的下标
if (a[i] > a[maxi])
maxi = i; //找到最大值的下标
}
swap(a, 0, mini);
if(!maxi) // 防止第一个数就是最大的,而第一次交换的时候把其交换到了mini的位置
maxi = mini;
swap(a, maxi, n - 1);
for (i = 0; i < n; i++)
printf("%d ", a[i]);
return 0;}
void swap(int v[], int i, int j) { int temp = v[i]; v[i] = v[j]; v[j] = temp;}
#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++){ scanf("%d",&a[i]);}
max=min=a[0];//注意初始化
for(i=0;i<n;i++)
{if(a[i]>=max){t1=i;max=a[t1];}
else if(a[i]<=min){t2=i;min=a[t2];}
}
t=a[0];
a[0]=a[t2]; //只更换最大最小值正确,而两者合并执行则错误。
a[t2]=t;
for(i=0;i<n;i++)
{if(a[i]>=max){t1=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++)
{printf("%d ",a[i]);}
return 0;}