这两天跟朋友聊天,聊到一道题,如何计算阶乘?
废话不多说直接上代码:
方式1:
/**
* 通过int来进行计算
* @param a
* @return
*/
public static int factorial1(int a){
int s=1;
while (a>1){
s*=a--;
}
return s;
}
方式2:
/**
* 通过dubbo来进行计算
* @param a
* @return
*/
public static double factorial2(int a){
double s=1.0;
while (a>1){
s*=a--;
}
return s;
}
方式3:
/**
* 如何处理精度的方式
* @param a
* @return
*/
public static String factorial3(int a){
int s=a,len=0;
while (s>1){//计算最大情况下的数组长度
len+=(""+s--).length();
}
int[] target=new int[len];//以最大情况去考虑被乘数的位数
target[0]=1;//初始化被除数
while (a>1){
int t=a--;//定义当前的介乘数
int q=0;//记录当前位的进位值
for(int x=0;x<(target.length-1);x++){//遍历被乘数的位数
int then=target[x]*t+q;//当前位的数值
target[x]=then%10;//计算当前位的值
q=then/10;//计算当前需要进位数
}
}
/**
* 合并输出字符串数值
*/
StringBuilder sb=new StringBuilder();
boolean flag=false;//记录舍零信号值
for(int z=target.length;--z>=0;){
if(!flag && target[z]!=0)
flag=true;
if(flag){
sb.append(target[z]);
}
}
return sb.toString();
}
方式4:
/**
* 通过BigInteger
* @param a
* @return
*/
public static String factorial4(int a){
BigInteger result = new BigInteger("1");//为result赋初始值,为1
for (int i = 1; i <= a; i++) {
BigInteger num = new BigInteger(String.valueOf(i));
result = result.multiply(num);//调用自乘方法
}
return result.toString();
}
方法调用:
public static void main(String[] args) {
System.out.println(factorial1(50));
System.out.println(factorial2(5000));
System.out.println(factorial3(5000));
System.out.println(factorial4(5000));
}
实现结果: