话说,前几天,和别人讨论了1000的阶乘问题,
C#写,讨论到最后的结果是:没有什么类型能够存储如此大的数据,于是还了一个思路,写了如下代码.
首先声明,我的代码都是表达的一个思想,很少有代码能够直接贴出去就用.
贴代码:
public static void GetX()
{
ArrayList x = new ArrayList();//声明一个数组,存放数据
x.Add(1);//初始化数组.这里不能为0如果为0那就始终为0了
for (int i = 1; i <= 1000; i++)//目前算1000的阶乘,运算1000次
{
int length = x.Count;//数组的长度
for (int y = length; y > 0; y--)//遍历数组中的每个元素*当前的阶乘数
{
int z = int.Parse(x[y-1].ToString()) * i;//每个元素*当前的阶乘数
x = GetY(x, z, y-1);//调用处理结果的方法
}
}
for (int i = x.Count; i >0 ; --i)//将算法的结果输出
{
Console.Write(x[i-1]);
}
Console.ReadLine();
}
public static ArrayList GetY(ArrayList x, int z, int length)//处理元素*当前阶乘数的结果
{
if (z > 10)//如果结果大于10
{
int p = z % 10;//结果摸上10得到当前结果数
int jinshu = (z - p) / 10;//得到进数
x[length] = p;//用当前结果数替换掉原有的结果数
if (int.Parse((x[length + 1]).ToString())+ jinshu>= 10)//如果下一个结果集+进数也大于10那么继续处理
{
if (x.Count <= length+1)
{
x.Add(0);
}
int zz = int.Parse((x[length + 1]).ToString())+ jinshu;//下一个元素+=进数,即为下一个元素的结果数
GetY(x, zz, length+1);//调用方法继续处理
}
else//进数小于10直接处理
{
if (x.Count <= length+1)//如果当前元素处于数组中的最后一个,则添加一个新元素
{
x.Add(0);
}
int zz = int.Parse(x[length+1].ToString());//下一个元素
zz += jinshu;//下一个元素+=进数
x[length + 1] = zz;//用结果替换下一个元素
}
}
else
{
x[length] = z;
}
return x;//返回值
}
OK代码贴完了,也作出了相应的注释
做的一个算法,也就是把数组中的每一个元素当成一个位数(个,十,百,千,万......),逢10进一.
当然还有缺陷,当时做的时候用的是List结果,List存储的数据长度不够,后来换了ArrayList ,
后来有人跟我说用List可以逢千进一,甚至逢万进一,这样结果集长度就够了,而且也省了装箱拆箱的操作,
当然这样还有一些东西需要考虑,例如:数组中一个元素int以后不足0的话需要补齐 逢千进一需补齐4个0逢万则需要5个0,输出的时候也需要考虑
不过思想出来了,又不需要用,我也就没有写了,目前只贴以上代码.