写一个程序,语言不限,打印出100的阶乘(即1*2*3*…*100)的精确数值结果(不能是浮点数)。如5的阶乘是1*2*3*4*5=120

using System;

class A
{
 public static void Main(string[] argv)
 {
  DateTime t1 = DateTime.Now;  
  BigFact( int.Parse(argv[0]));
  DateTime t2 = DateTime.Now;
  TimeSpan ts = t2 - t1;
  Console.WriteLine( "Run time {0} ms", ts.Milliseconds  );
 }

 public static void BigFact( int n )
 {
  int length = (int) (Math.Log10( 2 * Math.PI ) / 2 + Math.Log10( n ) / 2
      + n * ( Math.Log10( n ) - Math.Log10( Math.E ) ) ) + 1;
  Console.WriteLine( "Total Length:{0}", length );
  int currentLength = 1;
  int beginPoint = 0;
  UInt64[] result = new ulong[ length ];
  UInt64[] carry = new UInt64[ length ];

  result[ 0 ] = 1;

  const UInt64 BASE10 = 10000000000;
  for( UInt64 i = 2; i <= (UInt64) n; i++ )
  {
   for( int j = beginPoint; j < currentLength; j++ )
   {
    result[ j ] = result[ j ] * i + carry[ j ];
    carry[ j ] = 0;
    if ( result[ j ]  > BASE10 )
    {
     carry[ j + 1 ] = result[ j ] / BASE10;
     result[ j ] = result[ j ] % BASE10;
     if ( result[ j ] == 0 ) beginPoint++;
    }
   }
   if ( carry[ currentLength ] > 0 )
   {
    result[ currentLength ] = carry[ currentLength ];
    carry[ currentLength ] = 0;
    currentLength++;
   }
  }

  for( int i = currentLength - 1; i >= 0; i-- )
   Console.Write( "{0} ", result[ i ] > 0? result[ i ].ToString() : "0000000000" );
  Console.WriteLine();
   
 }

}


第一题我用了分组的方法,10个整数存一组,末尾0不参加运算(也不完全). 100!用10ms, 1000!用20ms,10000!用433ms,100000!用 539 ms。 (IBM T40P, windows xp, .Net 1.1 )

贴出代码来抛砖引玉,看看谁还能写出更快的算法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值