论坛首页 综合技术论坛

递归与分治策略(二):超大阶乘的实现

浏览 9954 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (15) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-12-17  
Solstice 写道
supersun 写道

 

C.不使用BigInteger,计算超大数阶乘算法——>用整型数组保存每位数的结果,最后返回字符串,效率最高

private static final String ArrayStringFactorial(int n) {
        int a[] = new int[200];// 确保保存最终运算结果的数组位数足够大,200位的数已经够大了
        int carry = 0;// 进位标志位
        int digit = 1;// 位数
        a[0] = 1;// 将结果先初始化为1
        int temp;// 阶乘的任一元素与临时结果的某位的乘积结果
        StringBuffer resultStr = new StringBuffer();

        for (int i = 2; i <= n; ++i)// 开始阶乘,阶乘元素从2开始依次“登场”
        {
            // 按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘
            for (int j = 1; j <= digit; ++j) {
                temp = a[j - 1] * i + carry;// 相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)
                a[j - 1] = temp % 10;// 更新临时结果的位上信息
                carry = temp / 10; // 看是否有进位
            }
            while (carry!=0?true:false)// 如果有进位
            {
                a[(++digit) - 1] = carry % 10;// 新加一位,添加信息。位数增1
                carry /= 10; // 看还能不能进位
            }
        }
        for (int i = digit; i >= 1; --i) {
            resultStr.append(a[i - 1]);
        }
        return resultStr.toString();

}
 


分治策略 请继续关注下文。。。。。。。。。。

 

你这完全是个 C 程序,结果的位数也限死了。

 

在网上随便找了一个C++的:

 

std::vector<int> void cal_factorial(int n)
{
  std::vector<int> a;
  a.push_back(1);

  for (int i = 2; i <= n; ++i) {
    int carry = 0;

    for (int j = 0; j < a.size(); ++j) {
      int temp = a[j] * i + carry;
      a[j] = temp % 10;
      carry = temp / 10;
    }

    while (carry) {
      a.push_back(carry % 10);
      carry /= 10;
    }
  }

  return a;
}
 

 

 

网上的确有很多这样的例子,我也看到过,请仁兄给出好的解决方案,,算法这个东西后人基本上都是在学习前人吧,有几个是原创的啊,你在网上找到的很多也是从经典制作中摘抄的。。。

0 请登录后投票
   发表时间:2009-12-18  
不知道那个BigInteger的数组方式(非递归)实现LZ是怎么个意思,我没理解,我觉得应该是这样的
private static final BigInteger distributePoker(int n) {
		// BigInteger数组
		BigInteger[] resultBigInteger = new BigInteger[n + 1];
		for (int i = 0; i <= n; i++) {
			if (i < 2)
				resultBigInteger[i] = BigInteger.ONE;
			else
				resultBigInteger[i] = resultBigInteger[i - 1]
						.multiply(BigInteger.valueOf(i));
		}
		return resultBigInteger[n];
	}
0 请登录后投票
   发表时间:2009-12-18   最后修改:2009-12-18
我也不明白你在说什么,你这个代码是想干什么呢


我原题是这么说的:扩展这样一组数字序列0,1,1,2,3,5,8........,求第100个数是多少!

           n=1,f(1)=0;
           n=2,f(2)=1;
           n=3,f(3)=f(1)+f(2)=0+1=1;
           n=4,f(4)=f(2)+f(3)=1+1=2;
           n=5,f(5)=f(3)+f(4)=1+1=1+2=3;
           n=6,f(6)=f(4)+f(5)=2+3=5;
           ..........................
           n=n,f(n)=f(n-2)+f(n-1);
编程实现f(100):这里用数组实现,用递归没效率(测试了下用递归比20!更大的话几乎半天不出结果)


   1. private static final BigInteger distributePoker(int n) { 
   2.         // BigInteger数组 
   3.         BigInteger[] resultBigInteger = new BigInteger[n]; 
   4.         for (int i = 0; i < n; i++) { 
   5.             if (i == 0) 
   6.                 resultBigInteger[i] = BigInteger.ZERO; 
   7.             if (i == 1) 
   8.                 resultBigInteger[i] = BigInteger.ONE; 
   9.             if(i>=2) 
  10.                 resultBigInteger[i] = resultBigInteger[i - 2] 
  11.                         .add(resultBigInteger[i - 1]); 
  12.         } 
  13.         return resultBigInteger[n - 1]; 
  14.  
  15. }

这里是用数组实现f(n)=f(n-2)+f(n-1)
0 请登录后投票
   发表时间:2009-12-18  
我也不明白你在说什么,你这个代码是想干什么呢


我原题是这么说的:扩展这样一组数字序列0,1,1,2,3,5,8........,求第100个数是多少!

           n=1,f(1)=0;
           n=2,f(2)=1;
           n=3,f(3)=f(1)+f(2)=0+1=1;
           n=4,f(4)=f(2)+f(3)=1+1=2;
           n=5,f(5)=f(3)+f(4)=1+1=1+2=3;
           n=6,f(6)=f(4)+f(5)=2+3=5;
           ..........................
           n=n,f(n)=f(n-2)+f(n-1);
编程实现f(100):这里用数组实现,用递归没效率(测试了下用递归比20!更大的话几乎半天不出结果)


   1. private static final BigInteger distributePoker(int n) {
   2.         // BigInteger数组
   3.         BigInteger[] resultBigInteger = new BigInteger[n];
   4.         for (int i = 0; i < n; i++) {
   5.             if (i == 0)
   6.                 resultBigInteger[i] = BigInteger.ZERO;
   7.             if (i == 1)
   8.                 resultBigInteger[i] = BigInteger.ONE;
   9.             if(i>=2)
  10.                 resultBigInteger[i] = resultBigInteger[i - 2]
  11.                         .add(resultBigInteger[i - 1]);
  12.         }
  13.         return resultBigInteger[n - 1];
  14. 
  15. }

这里是用数组实现f(n)=f(n-2)+f(n-1)
0 请登录后投票
   发表时间:2010-01-03  
阶乘也有分治策略?,斐波那契数倒有个矩阵乘法的做法
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics