开始正式上课,感觉还行,这是老师的第一天课的作业, 100!, 花了我整整一上午, 贴上来做个记念,
觉得代码很写得还行,代码很简单, 采用是迭代, 时间效用应该还不错, 比网上的一些递归的好.
以下是原代码:
using System;
namespace ConsoleApplication5
{
class Class1
{
/* 此问题即高精度算法,常用于银行,也可以用来算PI后几百位*/
static int[] factorial(int n) //阶乘算法,采用一维组数来保存
{
const int arraynum=200; //数组维数, 如果是1000的阶乘,变动此数即可
int[] fac = new int[arraynum]; //结果数组
int[] add = new int[arraynum]; //进位数组
for(int i=0; i<arraynum; i++) //初始化结果数组,第一个数为1, 即10000.....
fac[i]=0;
fac[0]=1;
for(int i=0; i<arraynum; i++) //初始化时位数组为0,即000000
add[i]=0;
for (int r=1;r<=n; r++) //迭代开始,即1*2*3*....n
{
for (int k=1;k<arraynum;k+=2)
{
add[k]=(fac[k-1] *r + add[k-1]) /10; //进位数组赋值,进位是从1开始
k--;
fac[k]=(fac[k] * r + add[k]) % 10; //结果数组赋值,结果是从0开始
}
}
return fac; //返回结果数组
}
static void Main(string[] args)
{
try
{
Console.WriteLine("请输入1-100的数字!");
String temp = Console.ReadLine();
int n= Int32.Parse(temp);
if(n<1||n>100)
throw new Exception("不是1-100范围的数字");
int[] result=factorial(n);
//逆向输出
int i=result.Length-1;
for (;i>=0;i--) //去掉数组前面是0的元素
{
if(result[i]!=0) break;
}
for(;i>=0;i--) //逆向输出,即00321, 输出为123
Console.Write("{0}",result[i]);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.ReadLine();
}
//程序结束
}
}
}