1.问题:在黑板上写了N个正整数作成的一个数列,进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直到黑板上剩下一个数,在所有按这种方式,最后得到的数中,最大的计作Max、最小的计做Min,求该数列的极差M=Max-Min?
2.设计思路:max是每一次取出数组中最小的两个数,进行a*b+1;min是每一次取出数组中最大的两个数,进行a*b+1;所以需要分别找出数组中最大和最小的两个数进行计算,把计算结果加入数组,同时在原来数组中删除a和b;一直循环,直到数组中的元素个数为1时退出;分别随着最大和最小的值,找到两个最小/最大的元素下标,需要把其中一个置为最大、最小,下一次就不会去除这个元素了。因为每一次都会破坏原来的数组,所以需要复制数组中的元素到新的数组,进行其他操作。
3.代码:
/*数列极差问题*/
#include <stdio.h>
#define N 3
#define MAX 0x7fffffff//32位2进制最大数
#define MIN 0x80000000//32位2进制最小数
int array[N]={3,7,5};
int array2[N];
int FindMax()
{
int max=MIN;
int maxindex=0; //初始最大元素的下标为0
for(int i=0;i<N;i++) //查找数组中最大的元素下标
{
if(array2[i]>max)
{
max=array2[i]; //取较大的值
maxindex=i;
//printf("max1=%d\n",i);
}
}
return maxindex;
}
int FindMin()
{
//printf("n2=%d\n",n);
int min=MAX;
int minindex=0; //初始最小元素的下标为0
for(int i=0;i<N;i++) //查找数组中最小的元素下标
{
if(array[i]<min)
{
min=array[i];
minindex=i;
}
}
return minindex;
}
int GetMax(int array[],int n) //max=每次从数组中取出两个最小的数进行a*b+1计算
{
int a,b;
int max=0;
int i=0,j=0; //记录下标
while(n>1)
{
i=FindMin(); //取数组中最小元素的下标
a=array[i];
//printf("a=%d\n",a);
array[i]=MAX; //把此位置赋值为最大值的,下一次就不会取出它
j=FindMin();
b=array[j];
//printf("b=%d\n",b);
array[j]=a*b+1; //把计算结果放入数组
n--;
}
//printf("j=%d\n",j);
//printf("array[j]=%d\n",array[j]);
return max=array[FindMin()]; //最后在找到数组中第二大的数,也就是仅小于MAX
}
int GetMin(int array[],int n) //min=每次从数组中取出两个最大的数进行a*b+1计算
{
int a,b;
int min=0;
int i,j; //记录下标
while(n>1)
{
i=FindMax(); //取数组中最大元素的下标
a=array[i];
printf("a=%d\n",a);
array[i]=MIN; //把此位置赋值为最小值的,下一次就不会取出它
j=FindMax();
b=array[j];
printf("b=%d\n",b);
array[j]=a*b+1; //把计算结果放入数组
n--;
}
return min=array[FindMax()]; //最后在找到数组中第二小的数,也就是仅大于MIN
}
int main()
{
for(int i=0;i<N;i++) //复制array数组,方便寻找寻找最小值的操作
{
array2[i]=array[i];
}
for(int i=0;i<N;i++) //复制array数组,方便寻找寻找最小值的操作
{
printf("array2=%d ",array2[i]);
}
int max=0,min=0;
max=GetMax(array,N);
printf("MIN=%d\n",MIN);
min=GetMin(array2,N);
printf("最大的数为:%d\n",max);
printf("最小的数为:%d\n",min);
printf("数列极差M=:%d\n",max-min);
return 0;
}
4.运行结果: