第一种实现小数字阶乘:
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; } } }