关于求一个正整数阶乘的实现

来源:互联网 发布:铺货软件 编辑:程序博客网 时间:2024/05/21 21:48

第一种实现小数字阶乘:

 class Calculate    {        private long n;        public Calculate(long _n)        {            this.n = _n;        }         public long calculateFactorial(long n)        {          if (n == 0)          {             return 1;          }           else if (n > 0)           {              return n * calculateFactorial(n - 1);           }           else           {             return 0;           }                    }    }
第二种实现方法:
 class Calculate    {        private long n;        public Calculate(long _n)        {            this.n = _n;        }        public string calculate(long n)        {            if (n < 0)            {                throw new ArgumentOutOfRangeException("n必须为非负数");            }            else if (n == 0 || n == 1)            {                string result = "1";                return result;            }            else            {                //maxLength为数组的长度,也就是计算的结果最多可以容纳maxLength位的数值                const long maxLength = 10000;                //array为存放数值的数组,一个下标存放一位数(0,1,2,3,4,5,6,7,8,9).如果为十的话,它就往在当前位置存储0,当前位置+1存储1                uint[] array = new uint[maxLength];                //因为阶乘的计算对象是非负整数,最小的值就是一                array[0] = 1;                int i = 0;                int j = 0;                int valid = 1;                //以六的阶乘计算:                //一:1*2*3*4*5*6=720                //array[0]=1;                //i=2,carry=0,j=0,valid=1,multipleResult=1*2+0=2,array[0]=2,carry=0;                //i=3,carry=0,j=0,valid=1,multipleResult=2*3+0=6,array[0]=6,carry=0;                //i=4,carry=0,j=0,valid=1,multipleResult=6*4+0=24,array[0]=4,carry=2,array[1]=2,valid=2,carry=0;                //i=5,carry=0,j=0,valid=2,multipleResult=4*5+0=20,array[0]=0,carry=2                //i=5,carry=2,j=1,valid=2,multipleResult=2*5+2=12,array[1]=2,carry=1,array[2]=1,valid=3,carry=0;                //i=6,carry=0,j=0,valid=3,multipleResult=0*6+0=0,array[0]=0,carry=0;                //i=6,carry=0,j=1,valid=3,multipleResult=2*6+0=12,array[1]=2,carry=1;                //i=6,carry=1,j=2,valid=3,multipleResult=1*6+1=7,array[2]=7,carry=0                for (i = 2; i <= n; i++)                {                    long carry = 0;                    for (j = 0; j < valid; j++)                    {                        long multipleResult = array[j] * i + carry;                        array[j] = (uint)(multipleResult % 10);                        carry = multipleResult / 10;                    }                    while (carry != 0)                    {                        array[valid++] = (uint)(carry % 10);                        carry /= 10;                    }                }               // uint[] result = new uint[valid];                /*                 *public static void Copy(                 * Array sourceArray,                 * Array destinationArray,                 * int length                 * )                 */                //Array.Copy(array, result, valid);                string result = "";                StringBuilder sb=new StringBuilder();                //int count = 0;                for (int k = valid-1; k >-1; k--)                {                    sb.Append(array[k]);                    if ((uint)array[k] == 0)                    {                        count++;                    }                }                //System.Console.WriteLine("0一共出现过:" + count + "次");                                result = sb.ToString();                return result;            }        }    }