华为云计算 云知识 阶乘的算法

阶乘的算法

话说,前几天,和别人讨论了1000的阶乘问题,

C#写,讨论到最后的结果是:没有什么类型能够存储如此大的数据,于是还了一个思路,写了如下代码.

首先声明,我的代码都是表达的一个思想,很少有代码能够直接贴出去就用.

贴代码:

public static void GetX()
{
ArrayList x = new ArrayList();//声明一个数组,存放数据
x.Add(1);//初始化数组.这里不能为0如果为0那就始终为0了
for (int i = 1; i <= 1000; i++)> {
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,输出的时候也需要考虑

不过思想出来了,又不需要用,我也就没有写了,目前只贴以上代码.

转载于:https://www.cnblogs.com/yixuesuibi/archive/2010/08/04/1791735.html

上一篇:mysql数据导出到excel的三种方式

下一篇:简单说明java的动态代理

51CTO

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
相关推荐