方法一,双重循环,每一趟外循环就求出一个B[i]。在每趟外循环中,初始B[i]为1,然后避开A[i],只计算其他数的乘积。
int* multiply(int* A, int ALen, int* returnSize ) {
int* ret = NULL;
ret = (int*)malloc(sizeof(int) * ALen);
*returnSize = ALen;
int i = 0, j = 0;
for(i = 0; i<ALen; i++){
ret[i] = 1;
for(j = 0; j<ALen;j++){
if(j != i)
ret[i] *= A[j];
}
}
return ret;
方法二;将B[i]分成前部分和后部分的乘积。
int* multiply(int* A, int ALen, int* returnSize ) {
int * B = NULL;
B = (int*)malloc(sizeof(int) * ALen);
*returnSize = ALen;
int i = 0, tmp = 1;
B[0] = 1; //计算B[1]的前部分时用到
for(i = 1; i < ALen; i++) //从前往后计算前部分
B[i] = B[i-1] * A[i-1];
//上面for循环结束时,B[i]均只完成了前部分的乘积
for(i = ALen - 1; i >= 0; i--){
B[i] = B[i] * tmp; //tmp为每个B[i]的后部分,初始B[n-1]=1
tmp = tmp * A[i]; //从B[n-1]到B[0]的后部分是不断增多的
}
return B;
}

京公网安备 11010502036488号