解题思路:
输入10个数;

先找到最小数与第一个数交换;

再找到最大数与最后一个交换;

输出交换后的十个数,每个后面带空格;


注意事项:
不可以同时找到最大数和最小数然后一起交换

有同学问为什么不可以,先找到最小最大,在一次性交换,原因如下

如输入数据: 10  1  2  3有

min=1,对应下标为 1   ;max=10对应下标为0

先与第一个数交换后为:1   10    2   3  ,但是注意此时正确max下标变成了1

继续按照之前记录的max下标0进行交换,即变成1与3交换,与实际10与3交换不相符,所以出错



参考代码:

#include <stdio.h>

void deal( int a[] );


int main()
{
    int x[10];
    for ( int i = 0; i < 10; i++ )
        scanf( "%d", &x[i] );

    deal( x );

    return(0);
}


void deal( int a[] )
{
    int max = 0, x, team, l, min = a[0];

    for ( int i = 0; i < 10; i++ )    //找最小数,交换
    {
        if ( a[i] < min )
        {
            min = a[i]; l = i;
        }
    }
    team    = a[0];
    a[0]    = min;
    a[l]    = team;
    for ( int k = 0; k < 10; k++ )     //找最大数,交换
    {
        if ( a[k] > max )
        {
            max = a[k]; x = k;
        }
    }
    team    = a[9];
    a[9]    = max;
    a[x]    = team;

    for ( int j = 0; j < 10; j++ )  //输出
        printf( "%d ", a[j] );
}

别忘点赞哦-.-

点赞(66)
 

0.0分

104 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 68 条评论

陆崇瑞 3年前 回复TA
我不明白为什么只对一半:
int main()
{
int a[10];
int t,i,j,k,l;
for(i=0;i<10;i++)
{scanf("%d",&a[i]);}
for(k=0;k<10;k++)
{
for(l=k+1;l<10;l++)
{
if(a[k]>a[l])
{
t=a[l];
a[l]=a[k];
a[k]=t;
}
}
}
for(j=0;j<10;j++)
{printf("%d ",a[j]);}
return 0;
}
小桐 3年前 回复TA
虽然有点小问题,但是不妨大碍 这样做就可以 一次找到最大最小值
#include <stdio.h>
int ru(int a[10])
{int i; 
for(i=0;i<10;i++)
 	scanf("%d",&a[i]);
return 0;
}
int chuli(int a[10])
{int x,i;
for(i=0;i<=9;i++)
	{if(a[9]<a[i])
		x=a[i],a[i]=a[9],a[9]=x;
	 if(a[0]>a[i])
	 	x=a[i],a[i]=a[0],a[0]=x;}
return 0;
}
int shuchu(int a[10])
{
int i;
for(i=0;i<10;i++)
	printf("%d ",a[i]);
return 0;}
int main()
{int a[10];
ru(a);
chuli(a);
shuchu(a);

return 0;
}
菜鸟 3年前 回复TA
max应初始化为max=min=a[0]而不是max=0
万一我的十个数里最小的是-1
那你给我输出个0是最小
所以0从哪里来呢?
seventeen 3年前 回复TA
@seventeen void change_min(int c[]) { 	int t,n,min,term; 	min=c[0]; 	for(t=1;t<10;t++) 	{ 		if(c[t]<min) 			{ 				min=c[t]; 				n=t; 		} 	} 	term=c[0]; 	c[0]=c[n]; 	c[n]=term; }
seventeen 3年前 回复TA
有人解答一下w运行错误:运行时错误,非法的内存访问,数组越界,指针漂移,调用禁用的系统函数。
Segmentation fault:段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域
#include <stdio.h>
void change_max(int b[]);
void change_min(int c[]);
int main()
{
	int a[10],i;
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	change_max(a);
	change_min(a);
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
	return 0;
}
void change_max(int b[])
{
	int s,m,max,temp;
	max=b[0];
	for(s=1;s<10;s++)
	{
		if(b[s]>max)
			{
				max=b[s];
				m=s;
		}
	}
	temp=b[9];
	b[9]=b[m];
	b[m]=temp;
}
御心 3年前 回复TA
我想请问假如输入是 2 5 1 1 1 8 9 6 9 4,如果程序正确,输出是多少?是 1 5 2 2 2 8 4 6 4 9吗?
如果按楼主的参考代码,输出是1 5 2 1 1 8 4 6 9 9。
我很疑惑,最小数是1,但有三个,每个都应该与第一个交换吧。最大数是9,有两个,每个都应该与最后一个数交换吧。所以我觉得输出应该是 1 5 2 2 2 8 4 6 4 9.
我不知道是题目有歧义,还是我理解有误,请解惑。
苏沐橙 4年前 回复TA
@江畔读书人 这个要都是负数就错了,,,,
zsai 4年前 回复TA
#include<stdio.h>

int num(int *a);

int main()
{
    int a[10];
    int i,temp;
    for(i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    num(a);
    for(i=0;i<9;i++){
        printf("%d ",a[i]);
    }
    printf("%d ",a[9]);
    return 0;
}


int num(int *a){
    int i,temp,min,max;
    min=0;
    max=9;
    for(i=0;i<10;i++){
        if(a[i]<a[min]){;
            min = i;
        }
        if(a[i]>a[max]){
            max = i;
        }
    }
         temp = a[min];
         a[min] = a[0];
         a[0] = temp;
         temp = a[max];
         a[max] = a[9];
         a[9] = temp;}
Sleep 4年前 回复TA
#include <bits/stdc++.h>
using namespace std;


int main(){
	int a[100]={0};
	int min_i=0,min=0,max_i=0,max=0,t=0;
	for(int i=0;i<10;i++){
		scanf("%d",&a[i]);
	}
	min=a[0];
	for(int i=0;i<10;i++){
		if(min>a[i])min_i=i,min=a[i];
	}
	
	t=a[0];//小数 
	a[0]=min;
	a[min_i]=t;
	
	for(int i=0;i<10;i++){
		if(max<a[i])max_i=i,max=a[i];
	}
	
	t=a[9];
	a[9]=max;
	a[max_i]=t;
	
	for(int i=0;i<10;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}
✔✘✔ 4年前 回复TA
看了楼主代码,我瞬间就明白我错在哪儿了,感谢