转自:http://blog.csdn.net/wumuzi520/article/details/7841280
给定一个数组a[N],我们希望构造数组b [N],
其中b[j]=a[0]*a[1]…a[N-1] / a[j],
在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量
(包括栈临时变量、堆空间和全局静态变量等)
解析:设b[0]=1
由b[i]=b[i-1]*a[i-1]可得
b[1] = a[0]
b[2] = a[0]a[1]
…
b[i] = a[0]a[1]a[2]…a[i-1]
…
b[n-1] = a[0]a[1]…a[n-2]
那么再通过b[0]这个变量来迭代出
1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],
迭代过程中分别乘以b[n-1], b[n-2], … , b[0]
1 /************************************************************************* 2 > File Name: 给定数组a[N]构造数组b[N].c 3 > Author: Juntaran 4 > Mail: JuntaranMail@gmail.com 5 > Created Time: 2016年08月24日 星期三 16时47分25秒 6 ************************************************************************/ 7 8 9 /* 10 给定一个数组a[N],我们希望构造数组b [N], 11 其中b[j]=a[0]*a[1]…a[N-1] / a[j], 12 在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度; 13 除遍历计数器与a[N] b[N]外,不可使用新的变量 14 (包括栈临时变量、堆空间和全局静态变量等) 15 16 解析:设b[0]=1 17 由b[i]=b[i-1]*a[i-1]可得 18 b[1] = a[0] 19 b[2] = a[0]a[1] 20 … 21 b[i] = a[0]a[1]a[2]…a[i-1] 22 … 23 b[n-1] = a[0]a[1]…a[n-2] 24 那么再通过b[0]这个变量来迭代出 25 1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1], 26 迭代过程中分别乘以b[n-1], b[n-2], … , b[0] 27 28 */ 29 30 #include <stdio.h> 31 32 void Translate(int a[], int b[], int n) 33 { 34 b[0] = 1; 35 36 for (int i = 1; i < n; ++i) 37 { 38 b[i] = b[i-1] * a[i-1]; 39 } 40 41 for (int i = 0; i < n; ++i) 42 { 43 printf("b[%d] is %d ", i, b[i]); 44 } 45 printf(" "); 46 47 for (int i = n-1; i >= 1; --i) 48 { 49 b[i] *= b[0]; 50 b[0] *= a[i]; 51 } 52 53 for (int i = 0; i < n; ++i) 54 { 55 printf("b[%d] is %d ", i, b[i]); 56 } 57 printf(" "); 58 } 59 60 int main() 61 { 62 int a[] = {2,3,4,5}; 63 int b[] = {0,0,0,0}; 64 Translate(a, b, 4); 65 66 for (int i = 0; i < 4; ++i) 67 { 68 printf("%4d ", a[i]); 69 } 70 printf(" "); 71 72 for (int i = 0; i < 4; ++i) 73 { 74 printf("%4d ", b[i]); 75 } 76 printf(" "); 77 }