方法一,双重循环,每一趟外循环就求出一个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; }