从别处看到的一道算法附加题

题目:已知一个数组a[N],构造一个数组b[N],构造规则:b[i]=a[0]*a[1]*a[2]...a[N]/a[i];
  要求:
     1、不可以使用除法;
     2、时间复杂度为O(n),空间复杂度为S(0);
     3、除遍历使用的变量外,不可以使用其它变量;

 

自己的解法虽然不合题意,终究是自己想的,但是极力只用1个.可以使用遍历变量我就无耻的把他当作遍历变量吧,空间复杂度就无法满足了使用递归的话.......

       思路很简单:递归到最后一个元素过程中边计算之前的数字乘法积,然后记录后面元素乘积和.

       //r1 :用来记录index后的元素乘积

       //r2 :index之前的元素的乘积

      //index:当前所处的元素的索引号 

       static void Fun(int[] a, int[] b, int index, ref int r1, int r2)

       个人觉得解法比较精炼,所以贴出来,给自己做个记录.

      

 1 class Program
 2     {
 3         static void Fun(int[] a, int[] b, int index, ref int r1, int r2)
 4         {
 5             if (index == b.Length - 1)
 6             {
 7                 b[index] = r2;
 8                 r1 = a[index];
 9                 return ;
10             }
11             r1 = 1;
12             Fun(a, b, index + 1,ref r1, r2 * a[index]);
13             b[index] = r2 * r1;
14             r1 = a[index] * r1;
15         }
16 
17 
18 
19         static void Main(string[] args)
20         {
21             int[] a = new int[11];
22             int[] b = new int[a.Length];
23             int total = 1;
24             for (int i = 0; i < a.Length; i++)
25             {
26                 a[i] = i + 1;
27                 total *= (i + 1);
28             }
29             //Console.WriteLine(total);
30             int r1 = 1;
31             int r2 = 1;
32             Fun(a, b, 0ref r1, r2);
33             for (int i = 0; i < b.Length; i++)
34             {
35                 Console.WriteLine(b[i] + "=" + total / a[i]);
36             }
37             Console.ReadLine();
38         }
39 
40 
41     }

 

posted @ 2012-05-11 17:58  HQL  阅读(452)  评论(0编辑  收藏  举报