1000的阶乘!

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]++;
    }
   }
  }
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值