本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入格式:
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出格式:
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例:
5
8 2 5 1 4
输出样例:
1 2 5 4 8
一开始的思路是直接从数组里找出最大最小值然后根据条件交换。
for (i = 0; i < n; i++)
{
if (min > a[i])
{
min = a[i];//找出最小值
}
if (max < a[i])
{
max = a[i];//找出最大值
}
这个的问题是只找出了最大最小值,并没有记录下最大最小值的下标,在后续交换的过程中无从下手。
然后再针对此问题的情况下,再找出最大最小值的情况下,设置min_num和max_num记录下它们的下标并按条件交换。
for (i = 0; i < n; i++)
{
if (min > a[i])
{
min = a[i];//找出最小值
min_num = i;
}
if (max < a[i])
{
max = i;//找出最大值
max_num = i;
}
}
//最小值与第一个交换
temp = a[0];
a[0] = a[min_num];
a[min_num] = temp;
//最大值与最后一个交换
temp = a[n - 1];
a[n - 1] = a[max_num];
a[max_num] = temp;
此后又出现了问题,事因是由于先实行最小值和第一个进行了交换,所以如果第一个值原来恰好是最大值的话,所以在进行了第一次交换后第一个值就不是最大值了,此时再用原来遍历时找到的最大值记录的下标进行交换答案是错误的。
针对这个问题采用了在进行第一次交换后重新遍历找到最大值的位置,然后再进行交换。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i, min, max, temp;
int min_num = 0, max_num = 0;
int *a;
scanf_s("%d", &n);
a = (int*)calloc(n, sizeof(int));//动态分配内存
for (i = 0; i < n; i++)//输入数组
{
scanf_s("%d", &a[i]);
}
min = a[0];
for (i = 0; i < n; i++)
{
if (min > a[i])
{
min = a[i];//找出最小值
min_num = i;
}
}
//最小值与第一个交换
temp = a[0];
a[0] = a[min_num];
a[min_num] = temp;
max = a[0];
for (i = 0; i < n; i++)
{
if (max < a[i])
{
max = a[i];//找出最大值
max_num = i;
}
}
//最大值与最后一个交换
temp = a[n - 1];
a[n - 1] = a[max_num];
a[max_num] = temp;
for (i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
return 0;
}