1. 程式人生 > >大整數四則運算Java實現

大整數四則運算Java實現

                                     大整數四則運算Java實現

文章開始把我喜歡的這句話送個大家:這個世界上還有什麼比自己寫的程式碼執行在一億人的電腦上更酷的事情嗎,如果有那就是讓這個數字再擴大十倍

import java.util.Random;
import java.util.Scanner;
/**
 * 大整數四則運算
 * @author beyond
 *
 */
public class Classone_2 { 
public static void main(String[] args){
Scanner leng=new Scanner(System.in);
System.out.println("please enter a's length: ");
int alength=leng.nextInt();
System.out.println("please enter b's length: ");
int blength=leng.nextInt();
int almlength = min(alength,blength);
int alalength = max(alength,blength);
Random r = new Random();
int[] a = new int[alalength];
int[] b = new int[alalength];
char[] c = {'+','-','*','/'};
int[] ares = new int[alalength+1];//存放加法的和,初始每位都為0
int[] bres = new int[alalength];//減法
int[] cres = new int[2*alalength];//乘法
   int[] dres = new int[alalength];//除法
   a[alalength-alength]=r.nextInt(9)+1;//隨機產生一個大於等於0小於9的數再加1
   b[alalength-blength]=r.nextInt(9)+1;
   //位數少的那一個數組前幾位是空的
   for(int i=alalength-alength+1;i<alalength;i++){
    a[i]=r.nextInt(10);
   }
   for(int i=alalength-blength+1;i<alalength;i++){
    b[i]=r.nextInt(10);
   }
  
   for(int i=alalength-alength;i<alalength;i++){
    System.out.print(a[i]);
   }
   int dom=r.nextInt(4);
   System.out.print(c[dom]);
   for(int i=alalength-blength;i<alalength;i++){
    System.out.print(b[i]);
   }//定義算式
   switch(dom)
   {
    case 0://add                
    for(int i=alalength-1;i>=0;i--){
                 ares[i+1]=a[i]+b[i]+ares[i+1];//ares[0]可能為0即兩數相加有位數沒有增長的情況
                 if(ares[i+1]>9){
                 ares[i]+=1;
                 ares[i+1]%=10;
                 }
           }
           System.out.print('=');
           if(ares[0]==0){//沒有增長位數
                 for(int i=1;i<alalength+1;i++)
                  System.out.print(ares[i]);
           }
           else{
                  for(int i=0;i<alalength+1;i++)
                  System.out.print(ares[i]);
               }
      break;
                 
      case 1:
           int com = 0;
           //a>b com=1,a<b com=0
           if(alength<blength){
            com=0;
           }
           if(alength>blength) com=1;
           if(alength==blength){
            int i;
            for( i=0;i<alength;i++){
            if(a[i]<b[i]){
            com=0;
            break;
            }
            if(a[i]>b[i]){
            com=1;
            break;
            }
               }
            if(i==alength)
            com=1;//判斷for迴圈沒比出結果的情況下則a b相等
           }
           switch(com)
           {
             case 0://b>a
             for(int i=alalength-1;i>=0;i--){
             bres[i]=b[i]-a[i]+bres[i];
                 if(bres[i]<0){//向前借位
                 bres[i]+=10;
                 bres[i-1]-=1;
                 }
             }
             System.out.print('=');
             System.out.print('-');
             int flag=0;
             for(flag=0;flag<alalength;flag++){
             if(bres[flag]!=0)
                 break;
             }
             for(int i=flag;i<alalength;i++){
             System.out.print(bres[i]);
             }
             break;
             case 1://a>b
             for(int i=alalength-1;i>=0;i--){
             bres[i]=a[i]-b[i]+bres[i];
                     if(bres[i]<0){
                     bres[i]+=10;
                     bres[i-1]-=1;
                     }
                 }
                 System.out.print('=');
                 int flagg=0;
                 for(flagg=0;flagg<alalength;flagg++){
                     if(bres[flagg]!=0)
                     break;
                 }
                 for(int i=flagg;i<alalength;i++){
                     System.out.print(bres[i]);
                 }
                 break;
           }                   
           break;
           
           case 2:
           for(int i=alalength-1;i>=alalength-alength;i--){//乘法實現
               for(int j=alalength-1;j>=alalength-blength;j--){
                cres[i+j+1]=a[i]*b[j]+cres[i+j+1];//重新寫入的方式改變陣列的值
               }
           }
           for(int i=2*alalength-1;i>=0;i--){
            if(cres[i]>9){
            cres[i-1]+=cres[i]/10;
            cres[i]%=10;
           
           }
           System.out.print('=');
           int k=0;
           while(cres[k++]==0);//k為乘積的位數
              
           for(int i=k-1;i<2*alalength;i++)
           System.out.print(cres[i]); 
           
           break;
           
           case 3:
           int k1=alalength;
           while(true){
            for(int i=alalength-1;i>=0;i--){
            bres[i]=a[i]-b[i]+bres[i];
            if(bres[i]<0 && i!=0){
            bres[i]+=10;
            bres[i-1]-=1;
            }
               }            
            for(k1=0;k1<alalength;k1++){
            if(bres[k1]<0)
            break;
            }
            if(k1!=alalength)
            break;
            dres[alalength-1]++;
            for(int q=alalength-1;q>0;q--){
            if(dres[q]>9){
            dres[q-1]+=1;
            dres[q]%=10;
            }
            }
            for(int j=0;j<alalength;j++){
            a[j]=bres[j];
            bres[j]=0;         
            }           
          }
          System.out.print('=');
          int dr=0;
          while(dres[dr++]==0);
          for(int ll=dr-1;ll<alalength;ll++){
               System.out.print(dres[ll]);
          }
          System.out.print("...");
          int k2=0;
          while(a[k2++]==0);
              
          for(int i=k2-1;i<alength;i++)
               System.out.print(a[i]);            
          break;
       }
}
public static int max(int a,int b){
if (a>=b)
return a;
else
return b;
}
public static int min(int a,int b){
if (a<=b)
return a;
else
return b;
}

}


加油吧,程式設計師!