10进制--> 1,000,000,000 进制
1000!阶乘0.048s 48ms (包含输出,以及每1000输出一次)
10000!阶乘5.553125s 5531.25ms (包含输出,以及每1000输出一次)
代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Factorial { class Program { static void Main( string [] args) { int Number = 0 ; // 接收输入 Console.WriteLine( @" Please input a numeric: " ); Number = int .Parse(Console.ReadLine().Trim()); DateTime BeginTime = DateTime.Now; DateTime EndTime = DateTime.Now; // 阶乘计算 FactorialWithBaseNumberAndList.FactorialCalculation(Number); EndTime = DateTime.Now; Console.WriteLine(EndTime.Subtract(BeginTime).TotalMilliseconds + " ms! " ); Console.ReadKey(); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Factorial { class FactorialWithBaseNumberAndList { public const ulong baseNumber = 1000000000 ; public static List < ulong > GetProduct(List < ulong > FactorX, List < ulong > FactorY) { List < ulong > ret = new List < ulong > (); ulong Carry = 0 ; // 进位数 ulong Product = 0 ; // 乘积 int Position = 0 ; // 位数 ulong Number = 0 ; // 乘积 % baseNumber 取余的余数 ulong TempNumber = 0 ; // 旧值 // 循环历遍因数X中的元素 for ( int i = 0 ; i < FactorX.Count; i ++ ) { // 清除进位数 Carry = 0 ; // 循环历遍因数Y中的元素 for ( int j = 0 ; j < FactorY.Count; j ++ ) { // 取得乘积,例如 9 * 9 = 81 Product = FactorX[i] * FactorY[j]; // 取得位数,例如 因数X的第1位 * 因数Y的第1位,那么其乘积所在开始的位数则为2, // 比如 20 * 30 中两个十位数相乘其结果 // 开始的位数为(2所在位数为1 + 3所在位数为1) = 6所在位数为2,即是600 Position = i + j; // 取得乘积 % baseNumber 取余的余数 Number = Product % baseNumber; // 判断乘积结果中该位是否有值,有值则相加,否则插入 if (ret.Count > Position) { // 临时存放旧值 TempNumber = ret[Position]; // 更新当前位的值,当前位值 = (旧值 + 取得乘积 % baseNumber 取余的余数 + 上一次进位数) % baseNumber 取余 ret[Position] = (TempNumber + Number + Carry) % baseNumber; // 取得当前进位值,當前進位值 = (旧值 + 乘积 + 进位)/baseNumber 取整 Carry = ( ulong )Math.Floor((TempNumber + Product + Carry) / baseNumber * 1.0 ); } else { // 插入位数,值 ret.Add((Number + Carry) % baseNumber); // 取得当前进位值,當前進位值 = (乘积 + 进位)/10 取整 Carry = ( ulong )Math.Floor((Product + Carry) / baseNumber * 1.0 ); } } // 当最后进位数不为0时,需要新增最高位,其值为进位数 if (Carry != 0 ) ret.Add(Carry); } return ret; } /// <summary> /// 阶乘计算 /// </summary> public static void FactorialCalculation( int Number) { List < ulong > ProductZ = new List < ulong > (); // 乘积Z - Dictionary List < ulong > FactorX = new List < ulong > (); // 因数X - Dictionary // 初始化乘积,避免出错 ProductZ.Add( 1 ); // 阶乘数历遍,从1开始 for ( int i = 1 ; i <= Number; i ++ ) { // 清空因数 FactorX.Clear(); // 每1000个数输出一次 if (i % 1000 == 0 ) Console.WriteLine(i.ToString()); FactorX.Add(Convert.ToUInt64(i)); // 计算乘积,将上一次的结果作为因数Y传入 ProductZ = GetProduct(FactorX, ProductZ); } // 显示结果 ShowResult(ProductZ); } /// <summary> /// 显示结果 /// </summary> /// <param name="Product"> 乘积 - List </param> /// <param name="DecimalDigits"> 小数位数 - int </param> public static void ShowResult(List < ulong > Product) { StringBuilder sb = new StringBuilder(); for ( int i = Product.Count - 1 ; i >= 0 ; i -- ) { sb.Append(Product[i]); } Console.WriteLine( " Result: " + sb.ToString()); } } }