在黑板上写n个正整数排成的一个数列,进行如下操作:
每次擦掉其中的两个数a和b,然后在数列里面加入一个数a*b+1,
如此循环往复直到黑板上只剩下一个数,在所有按这种操作方式
最后得到的数中,最大的记为max,最小的记min,则该数列的极差
定义为m=max-min。
输入一个正整数n,然后输入n个正整数构成一个数列。
输出这n个正整数构成的数列的极差。
1 #include<stdio.h>2 #include<stdlib.h>3 long maxNumber;//整个数组里面的最大的数 4 long maxNumberIndex;5 long max(long *a,long len);6 long min(long *a,long len);7 8 int main()9 {10 long *a,*b,n,i,maxN,minN;11 freopen("5.in","r",stdin);12 scanf("%ld",&n);13 a=(long *)malloc(sizeof(long)*n);14 b=(long *)malloc(sizeof(long)*n);15 for(i=0;i<n;i++)16 {17 scanf("%ld",a+i);18 b[i]=a[i];19 }20 minN=min(b,n);//注意:必须先调用min()函数再调用max()函数 21 maxN=max(a,n);22 //printf("%ld %ld\n%ld\n",maxN,minN,maxN-minN);23 printf("%ld\n",maxN-minN);24 return 0;25 }26 long max(long *a,long len)//返回相乘结果最大的那个乘积 27 {28 long i,min1,min2,min1Index,min2Index,m;//min1,min2表示最小和次小的两个数的值。min1Index和min2Index表示最大和次大的两个数的下标 29 //注意:数组a里面最小和次小的两个数可以是一样大小,但不可能是下标相同的两个数 .30 while(len>1)31 {32 min2=min1=maxNumber;33 min2Index=min1Index=maxNumberIndex;34 for(i=0;i<len;i++)35 {36 if(a[i]<min1)37 {38 min2=min1;39 min2Index=min1Index;40 min1=a[i];41 min1Index=i;42 }43 else if(a[i]<min2)44 {45 min2=a[i];46 min2Index=i;47 }48 }49 m=min1*min2+1;50 51 if(min1Index>min2Index)52 {53 a[min2Index]=m;54 if(m>maxNumber)55 {56 maxNumber=m;//更新当前数组里面的最大值 57 maxNumberIndex=min2Index;58 }59 a[min1Index]=a[len-1];60 len--;61 }62 else 63 {64 a[min2Index]=a[len-1];65 a[min1Index]=m;66 if(m>maxNumber)67 {68 maxNumber=m;//更新当前数组里面的最大值 69 maxNumberIndex=min1Index;70 }71 maxNumberIndex=min1Index;72 len--;73 }74 }75 return a[0];76 }77 long min(long *a,long len)//返回相乘结果最小的那个乘积 78 {79 long i,max1,max2,max1Index,max2Index,m;//max1,max2表示最大和次大的两个数的值。max1I和max2I表示最大和次大的两个数的下标 80 //注意:数组a里面最大和次大的两个数可以是一样大小,但不可能是下标相同的两个数 .81 int f=0;82 while(len>1)83 {84 max2=max1=-1;85 max2Index=max1Index=-1;86 for(i=0;i<len;i++)87 {88 if(a[i]>max1)89 {90 max2=max1;91 max2Index=max1Index;92 max1=a[i];93 max1Index=i;94 }95 else if(a[i]>max2)96 {97 max2=a[i];98 max2Index=i;99 } 100 } 101 m=max1*max2+1; 102 if(f==0) 103 { 104 maxNumber=max1;//保存整个数组的最大值,以便在调用max()函数的时候方便寻找最小的两个数。 105 maxNumberIndex=max1Index; 106 f=1; 107 } 108 if(max1Index>max2Index) 109 { 110 a[max2Index]=m; 111 a[max1Index]=a[len-1]; 112 len--; 113 } 114 else 115 { 116 a[max2Index]=a[len-1]; 117 a[max1Index]=m; 118 len--; 119 } 120 } 121 return a[0]; 122 }