70.實現一個簡單的百億級別的計算器

編程題目:

70.有兩個數,一個數是123789965783241232323512323676678,
另一個數是23245235435436807768829454365465889,用算法實現這兩個正數的加減以及相乘。

示例代碼:

package program.calculation.exercise70;

/**
 * 70.有兩個數,一個數是123789965783241232323512323676678,
 * 另一個數是23245235435436807768829454365465889,
 * 用算法實現這兩個正數的加減以及相乘。
 */

public class MyBigInteger {
	public static void main(String[] args) {  
         
        String str1 = "123789965783241232323512323676678";  
        String str2 = "23245235435436807768829454365465889"; 
		//String str1 = "240";  
        //String str2 = "12";  
        
        System.out.println("兩數之和:"+add(str1, str2));
        System.out.println("兩數之差:"+subtract(str1, str2));
        System.out.println("兩數之積:"+multiply(str1, str2));
        
    } 
	
	//相加
	private static String add(String str1, String str2) {
		
		//將str1與str2的位數設爲相同,不同的前面補0
		if(str1.length() >= str2.length()){
			for(int i=str2.length();i<str1.length();i++){
				str2 = "0"+str2;
			}
		}else{
			for(int i=str1.length();i<str2.length();i++){
				str1 = "0"+str1;
			}
		}
		
		int num1[] = new int[str1.length()];//大數1  
        int num2[] = new int[str2.length()];//大數2  
        int num3[] = new int[str1.length()+1];//結果數組 ,兩數相加有可能進位,所以結果數組長度應加1 
        
        //將字符串轉換成字符,然後再轉換成數字
        for (int i=0;i<num1.length;i++) {  
            num1[i] = str1.charAt(num1.length-1-i)-48;//大數1,數字0的ASCII碼值爲48  
        }  
        for (int i=0;i<num2.length;i++) {  
            num2[i] = str2.charAt(num2.length-1-i)-48;//大數2  
        } 
        
        //num3調整 :對num3進行判斷可能存在一個位置是兩位數字的情況 
        for (int i=0;i<num1.length;i++) {  
        	int temp1 = (num1[i]+num2[i])/10;//進位  
            int temp2 = (num1[i]+num2[i])%10;//本位  
            num3[i] = num3[i]+temp2;  
            num3[i+1] = num3[i+1]+temp1;     
        } 
        
        //判斷結果num3是否以零開頭,若爲零則不顯示
        String str = "";
        for(int i=num3.length-1;i>=0;i--){
        	str += num3[i];
        }
        return str.replaceAll("^0*", "");
		
	}

	//相減
	private static String subtract(String str1, String str2) {
		
		//如果兩個數相等,則結果爲0
		if(str1.equals(str2)){
			return "0";
		}
		
		//將str1與str2的位數設爲相同,不同的前面補0
		if(str1.length() >= str2.length()){
			for(int i=str2.length();i<str1.length();i++){
				str2 = "0"+str2;
			}
		}else{
			for(int i=str1.length();i<str2.length();i++){
				str1 = "0"+str1;
			}
		}
		
		int num1[] = new int[str1.length()];//大數1  
        int num2[] = new int[str2.length()];//大數2  
        int num3[] = new int[str1.length()];//結果數組  
        
        //將字符串轉換成字符,然後再轉換成數字
        for (int i=0;i<num1.length;i++) {  
            num1[i] = str1.charAt(num1.length-1-i)-48;//大數1,數字0的ASCII碼值爲48  
        }  
        for (int i=0;i<num2.length;i++) {  
            num2[i] = str2.charAt(num2.length-1-i)-48;//大數2  
        } 
        
        //判斷哪個數更大
        boolean bigger = false;
        for(int i=0;i<num1.length;i++){
        	if(num1[i] > num2[i]){
        		bigger = true;
        	}
        	if(num1[i] < num2[i]){
        		bigger = false;
        	}
        }
        
        //獲取num3,但num3有可能以零開頭
        for (int i=0;i<num1.length;i++) {  
        	if(bigger){
        		num3[i] = num1[i]-num2[i];
            	if(num3[i] < 0){ //若相減小於零,則向前借位
            		num1[i+1] -= 1; //向前借1位
            		num1[i] += 10; //本位加10
            	}
            	num3[i] = num1[i]-num2[i];
        	}else{
        		num3[i] = num2[i]-num1[i];
            	if(num3[i] < 0){
            		num2[i+1] -= 1;
            		num2[i] += 10;
            	}
            	num3[i] = num2[i]-num1[i];
        	}
        	    
        } 
        
        //判斷結果num3是否以零開頭,若爲零則不顯示
        String str = "";
        for(int i=num3.length-1;i>=0;i--){
        	str += num3[i];
        }
        return str.replaceAll("^0*", "");
        
		
	}

	//相乘
	private static String multiply(String str1, String str2) { 
    	
        int num1[] = new int[str1.length()];//大數1  
        int num2[] = new int[str2.length()];//大數2  
        int num3[] = new int[str1.length()+str2.length()];//結果數組  
        
        //將字符串轉換成字符,然後再轉換成數字
        for (int i=0;i<num1.length;i++) {  
            num1[i] = str1.charAt(num1.length-1-i)-48;//大數1,數字0的ASCII碼值爲48  
        }  
        for (int i=0;i<num2.length;i++) {  
            num2[i] = str2.charAt(num2.length-1-i)-48;//大數2  
        } 
        
        //num3調整 :對num3進行判斷可能存在一個位置是兩位數字的情況 
        for (int i=0;i<num1.length;i++) {  
            for (int j=0;j<num2.length;j++) {  
                int temp1 = num1[i]*num2[j]/10;//進位  
                int temp2 = num1[i]*num2[j]%10;//本位  
                num3[i+j] = num3[i+j]+temp2;  
                num3[i+j+1] = num3[i+j+1]+temp1;  
            }  
        } 
        
        //判斷結果num3是否以零開頭,若爲零則不顯示
        String str = "";
        for(int i=num3.length-1;i>=0;i--){
        	str += num3[i];
        	//System.out.println(num3[i]);
        }
        return str.replaceAll("^0*", "");
        
    } 
	
}

結果顯示:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章