给定一个长度为N的整数数组,只允许使用乘法,不能用除法,计算任意N-1个数的组合中乘积中最大的一组,并写出算法的时间复杂度
如果数组中没有负数,编程如下:
void main(){
//求N-1个数的乘积的最大着
int A[N];
int i;
int sum=1;
int minpos;
srand(time(NULL));
for(i=0;i<MAXSIZE;i++){
while((A[i]=rand()%MAXSIZE)==0);printf("%d ",A[i]);
}//for
for(i=1,minpos=0;i<MAXSIZE;i++){
if(A[i]<A[minpos]) {sum*=A[minpos];minpos=i;}
else sum*=A[i];
}//for
printf("/nN-1个数字的最大乘积是%d/n",sum);
}//main
后来想到,如果有负数的话,那么程序要考虑负数,于是编程如下:
void main(){
//数组中可能存在负数
int min,max; //min用于正数,max用于负数
int A[MAXSIZE];
int i,sum;
int exist_0=0;
min=max=MAXSIZE; //初始化
srand(time(NULL));
for(i=0;i<MAXSIZE;i++){
A[i]=(rand()%MAXSIZE)-(rand()%MAXSIZE);
printf("%d ",A[i]);
}//for
for(i=0,sum=1;i<MAXSIZE;i++){
if(A[i]==0) {exist_0=1;continue;}
if(A[i]<0){
if(max==MAXSIZE) max=A[i];
else{
if(max<A[i]) {sum*=max;max=A[i];}
else sum*=A[i];
}//else
}//if
else {
if(min==MAXSIZE) min=A[i];
else{
if(min>A[i]) {sum*=min;min=A[i];}
else sum*=A[i];
}//else
}//else
}//for
if(sum>0){
sum*=min;
if(exist_0==1) sum=0;
}//if
else{
if(sum<0) sum*=max;
if(exist_0==1) sum*=min;
}//else
printf("/nN-1个数字的最大乘积是%d/n",sum);
}//main
后来看答案,发现我和答案不一样,不过我觉得我的算法也还可以,时间复杂度嘛,貌似是O(n)……