1000的阶乘是一个非常之大的数字,在看到这个问题的第一个反应就是,直接运算肯定会溢出,事实也如此,我们如何解决这个问题呢?
我们小学的时候就会计算这样的乘法:123*9
三九二十七进二写七 7 2
二九十八 十八加二等于二十 进二写零 0 2
一九得九 九加二十一 进一写一 1 1
最后的结果是1107
如何计算阶乘结果的位数?
方法一:
log1+log2+log3+log4+...+logn 取整加1
方法二:
斯特林公式
按照这样的步骤,把每次得到的结果存放到数组里,考虑到无法确定数组长度,采用ArrayList
实现如下:
Java代码
publicstaticvoidfactorial(intvalue) {
ArrayList result =newArrayList();
intcarryBit =0;
result.add(newInteger(1));
for(intout =2; out <= value; out++) {
for(intin =0; in
inttemp = ((Integer) result.get(in)).intValue() * out
+ carryBit;
result.set(in,newInteger(temp %10));
carryBit = temp /10;
}
while(carryBit !=0) {
result.add(newInteger(carryBit %10));
carryBit = carryBit /10;
}
}
StringBuffer sb=newStringBuffer(result.size());
for(inti=0;i
{
sb.append(result.get(i));
}
sb=sb.reverse();
System.out.println("result="+sb);
System.out.println("结果位数"+result.size());
}
public static void factorial(int value) {
ArrayList result = new ArrayList();
int carryBit = 0;
result.add(new Integer(1));
for (int out = 2; out <= value; out++) {
for (int in = 0; in < result.size(); in++) {
int temp = ((Integer) result.get(in)).intValue() * out
+ carryBit;
result.set(in, new Integer(temp % 10));
carryBit = temp / 10;
}
while (carryBit != 0) {
result.add(new Integer(carryBit % 10));
carryBit = carryBit / 10;
}
}
StringBuffer sb=new StringBuffer(result.size());
for(int i=0;i
{
sb.append(result.get(i));
}
sb=sb.reverse();//倒序
System.out.println("result="+sb);
System.out.println("结果位数"+result.size());
}
C语言版:(自己写的)
#include
using namespace std;
void factorial(int value);
void main()
{
factorial(10); }
void factorial(int value)
{ int result[10000]={0};
int result_size=1;//实时更新result的实际位数
int carryBit =
0; //进位的值
result[0]=1;//初始结果为1
for (int out = 2; out <= value;
out++) { for (int in = 0; in < result_size; in++)
{ int temp = result[in] *
out + carryBit; result[in]=temp % 10; carryBit = temp / 10; } while (carryBit != 0) { result[result_size]=carryBit %
10; result_size++;
carryBit = carryBit / 10; } }
cout<
for(int
i=0;i
} }
感悟:
任务复杂的事情,都是需要分解成一小块一小块的小任务去完成的呀!!
事无巨细!!