话说,前几天,和别人讨论了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,输出的时候也需要考虑

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

posted on 2010-08-04 09:46  ﹄达……者﹃  阅读(656)  评论(0编辑  收藏  举报