数组实现int随机数的阶乘(避免大数问题)

时间:2021-05-28 19:16:56

面试的一道题目,实现int随机数的阶乘。这道题就是考察你考没考虑大数问题,如何避免它。 我能想到的就是用数组去实现,然后写了一下代码。但是当i的值很大,接近Max_value时的情况还没有考虑到。

直接看代码:mul进行数组每一位的阶乘,carry()用来对数组的每一位进位,pos记录当前的数组有效位置。这道题还是用ArrayList写比较好,免得浪费空间(有空在更新)。

public class BigNumMul {
public static void main(String args[]){
SolutionBigNumMul s=new SolutionBigNumMul();
s.mul(1000);
}
} class SolutionBigNumMul{ public int res[]=new int[100000];
public void mul(int num){
int pos=1;//当前数组的有效位数+1;
res[0]=1;
for(int i=2;i<=num;i++){
for(int j=0;j<pos;j++){
res[j]=res[j]*i;
}
pos=Carry(res,pos);//把数组从index=0~pos-1,进位,然后更新pos的值。
}
StringBuffer sb=new StringBuffer();//用一个StringBuffer来显示大数
for(int i=pos-1;i>=0;i--){
sb.append(res[i]);
}
System.out.println(sb.toString());
}
public int Carry(int res[],int pos){
int carry=0;int i=0;
for(;i<=pos-1;i++){
res[i]+=carry;
if(res[i]<10){
carry=0;
}else if(res[i]>9&&i<pos-1){
carry=res[i]/10;
res[i]=res[i]%10;
}else{
while(res[i]>9){
carry=res[i]/10;
res[i]=res[i]%10;
i++;
res[i]=carry;
}
}
}
return i;
}
}