static int MAX_A = 10;// 目标数最大位数
static int MAX_B = 990;// 临时数组最大位数
static int MAX_C = 1000;// 结果最大位数.注意MAX_A+MAXB不能大于MAX_C(很难解释这个)
static int[] a = new int[MAX_A];// {2,5,6};//目标数,此为求652的阶乘.
static int[] temp = new int[MAX_B] ;// 中间数组,用来保存中间值
static int[] c = new int[MAX_C ];// 结果数组
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
boolean done =false;
a[0]=8;
a[1]=9;
a[2]=9;
//a[3]=1;
do
{
if(!done)
{
CopyArray(temp,a,MAX_B,MAX_A);
}
else
CopyArray(temp,c,MAX_B,MAX_C);
a[0]--;
if(IsZero(a,MAX_A))
break;
if(a[0]<0)
{
int j=0;
while(a[j]<0)
{
a[j]=9;
a[j+1]--;
j++;
}
}
ClearArray(c,MAX_C);
Mul(temp,a,c);
done = true;
}while(true);
int tag=0;
for(int i=MAX_C-1;i>=0;i--)
{
if((c[i]==0)&&(tag==0)) continue;//去掉结果前面的0;
System.out.print(c[i]);
tag = 1;
}
if(tag==0)
System.out.print(0);
}
// 由于不同大小之间数组不能赋值,所以写了下面的复制函数
static void CopyArray(int[] pDes, int[] pSource, int sizeDes, int sizeSrc) {
for (int i = 0; i < sizeDes; i++) {
if (i < sizeSrc)
pDes[i] = pSource[i];// 复制位
else
pDes[i] = 0;// 多出的位补0
}
}
static void ClearArray(int[] pArray, int size)// 清除数组为0.相当于整型变量的int i=0操作.
{
for (int i = 0; i < size; i++) {
pArray[i] = 0;
}
}
static boolean IsZero(int[] pArray, int size)// 判断数组是否为0
{
for (int i = 0; i < size; i++) {
if (pArray[i] != 0)
return false;
}
return true;
}
static void Mul(int[] pa, int[] pb, int[] pc)// 两大数相乘算法
{
int i, j;
for (i = 0; i < MAX_A; i++) {
for (j = 0; j < MAX_B; j++) {
pc[i + j] = pc[i + j] + (pa[j] * pb[i]) % 10;
if (pc[i + j] > 9) {
pc[i + j] = pc[i + j] % 10;
pc[i + j + 1]++;
}
pc[i + j + 1] = c[i + j + 1] + (pa[j] * pb[i]) / 10;
if (pc[i + j + 1] > 9) {
pc[i + j + 1] = pc[i + j + 1] % 10;
pc[i + j + 2]++;
}
}
}
}