大数的相乘--用int数组做

来源:互联网 发布:手机慢镜头软件下载 编辑:程序博客网 时间:2024/06/01 10:38

import java.util.ArrayList;
import java.util.List;

public final class Demo
{

    /**
     * 计算n的阶乘最后一位非零数字<br>
     * 输入值非法时返回-1
     *
     * @param n 需要计算阶乘的数字(0<n<200000000)
     * @return int n!最后一位非0数字
     *
     */
    public  int count(int n)
    {
     if(n > 0 && n < 200000000)
     {
      int[] a = convertInt(n);
      List<int[]> list2 = new ArrayList<int[]>();
      for (int i = 1;i < n; i++)
      {
       int[] b = convertInt(n-i);
       if (i == 1)
       {
        list2.add(mul(a,b));
       }
       else
       {
        list2.add(mul(list2.get(i-2),b));
       }
      }
      int length = list2.get(list2.size()-1).length;
      int[] answer = new int[length];
      answer = list2.get(list2.size()-1);
      for (int m = 0;m < length;m++)
      {
       if(answer[length-1-m] != 0)
       {
        System.out.println(answer[length-1-m]);
        System.out.println(toString(answer));
        return answer[length-1-m];
       }
      }
     }
     System.out.println("error!n不符合要求");
     return -1;
    }
    // int数组乘以int数组
    public int[] mul(int[] a1, int[] b1)
 {
     List<int[]> list = new ArrayList<int[]>();
     for (int i = 0;i < b1.length;i++)
     {
      int[] num = new int[a1.length];
      for(int k=0;k<a1.length;k++)
      {  
       num[k]=a1[k];  
      }
      if(i == 0)
      {
       list.add(mul(num,b1[b1.length-1]));
      }
      if (i > 0)
      {
       list.add(moveInt(mul(num,b1[b1.length-1-i]),i));
      }
     }
     List<int[]> list1 = new ArrayList<int[]>();
     if (null != list && !list.isEmpty())
     {
      
      for (int i = 0;i < list.size();i++)
         {
       if (i == 0)
       {
        list1.add(add(new int[1],list.get(i)));
       }
       else
       {
        list1.add(add(list1.get(i-1),list.get(i)));
       }
         }
      return list1.get(list1.size()-1);
     }
     return null;
 }
    // int数组乘以int
    public int[] mul(int[] a2, int b2)
 {
     int firstDigit = 0;
     for(int i = a2.length -1;i >= 0;i--)
     {
      int ride = a2[i] * b2;
      if(ride < 10)
   {
       a2[i] = ride;
   }
      else
      {
       if(i == 0)
    {     
     if(ride > 9)
     {      
      a2[0] = ride % 10;      
      firstDigit = ride / 10;     
     }
     else
     {      
      a2[0] = ride;     
     }    
    }
    else
    {     
     a2[i-1] = a2[i-1] + ride / 10;     
     a2[i] = ride % 10;    
    }
      }
     }
     if(firstDigit != 0)
  {   
   int[] newAry = new int[a2.length + 1];   
   newAry[0] = firstDigit;   
   System.arraycopy(a2, 0, newAry, 1, a2.length);      
   return newAry;
  }
  else
  {   
   return a2;
  }
 }
    // 对int数组进行加运算
    public  int[] add(int[] a3, int[] b3)
 {
     int[] min = a3;  
  int[] max = b3;    
  if(max.length < min.length)
  {   
   int[] temp = max;   
   max = min;   
   min = temp;  
  }    
  int firstDigit = 0;  
  for(int i = min.length - 1, j = max.length - 1; i >= 0; i--, j--)
  {   
   int sum = min[i] + max[j];      
   if(sum < 10)
   {    
    max[j] = sum;   
   }
   else
   {    
    if(j == 0)
    {     
     if(sum > 9)
     {      
      max[0] = sum % 10;      
      firstDigit = sum / 10;     
     }
     else
     {      
      max[0] = sum;     
     }    
    }
    else
    {     
     max[j-1] = max[j-1] + sum / 10;     
     max[j] = sum % 10;    
    }       
   }  
  }    
  if(firstDigit != 0)
  {   
   int[] newAry = new int[max.length + 1];   
   newAry[0] = firstDigit;   
   System.arraycopy(max, 0, newAry, 1, max.length);      
   return newAry;
  }
  else
  {   
   return max;
  }
 }
    // 把int转化为int数组
    public int[] convertInt(int n1)
    {
     String num1 = "" + n1;
  int[] intArray = new int[num1.length()];
  for (int i = 0;i < num1.length();i++)
  {
   intArray[i] = Integer.parseInt(num1.substring(i, i+1));
  }
  return intArray;
    }
    // 对int数组进行左移操作
    public int[] moveInt(int[] a4,int i)
    {
     int[] b4 = new int[a4.length+i];
     for (int j = 0;j < a4.length;j++)
     {
      b4[j] = a4[j];
     }
     return b4;
    }
    // 把int数组转化为String
 public String toString(int[] ary)
 {  
  if(ary == null || ary.length == 0)
  {   
   return "0";  
  }    
  String sb = "";  
  for(int i = 0;i < ary.length; i++)
  {   
   sb+= ary[i];  
  }    
  return sb.toString(); 
 }
}

原创粉丝点击