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*", "");
        
    } 
	
}

结果显示:

在这里插入图片描述


版权声明:本文为jsc123581原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。