蓝桥杯VIP试题 之 基础练习 高精度加法 - JAVA

问题描述
  输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
  由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
  最后将C输出即可。
输入格式
  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
  输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012

PS:在写程序的时候需要考虑,进位两次的时候(即后者进位,导致前者进位),还有一点要注意的是最高位需要进位.
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner (System.in);
	    String a=sc.next();
	    String b=sc.next();	
	    
	    int[] arr_intA = new int[a.length()];
	    int[] arr_intB = new int[b.length()];
	    
	    //使用截取字符串的方法将每一个字符都转换为int类型,继而将其倒叙存到int数组中
	    for (int i = 0; i < a.length(); i++) {
	    	arr_intA[a.length() - i - 1] = Integer.parseInt(a.substring(i, i + 1));
	    }
	    for (int i = 0; i < b.length(); i++) {
	    	arr_intB[b.length() - i - 1] = Integer.parseInt(b.substring(i, i + 1));
	    }
	    
	    //使用字符传 --> char数组 --> int数组	 
	    /*
	    //将用户输入的a,b存起来
	    char[] arr_charA = a.toCharArray();
	    char[] arr_charB = b.toCharArray();
	    
	    //由char类型转换为int类型
	    for(int i=0; i<arr_charA.length;i++) {
	    	arr_intA[i] = arr_charA[i]-'0'; 
        }  
	    for(int i=0; i<arr_charA.length;i++) {
	    	arr_intB[i] = arr_charB[i]-'0'; 
        }  
	    */

	    //用来存相加结果
	    int[] arrRes = new int[101];
	    //用长数组 -->作为循环条件
	    int length = arr_intA.length > arr_intB.length ? arr_intA.length :arr_intB.length;
	    //进位值
	    int jiwei = 0;
	    //将两个倒叙的int[]对应位数相加 
	    for(int i=0;i<length;i++)
	    {
	    	int num1 = 0,num2 = 0;
	    	//若长度够,则取值,
	    	if(arr_intA.length > i){
	    		num1 = arr_intA[i];
	    	}
	    	if(arr_intB.length > i){
	    		num2 = arr_intB[i];
	    	}
	    	//做加法 数1 + 数2 + 进位值
	    	int temp = num1 + num2 + jiwei;
    		arrRes[i] = temp%10; //最终该位置的值
    		jiwei = temp/10; //进位使用
	    }
	    
	    //若进位不为0则最高位数还需进位1 -> 如:(218+838)
	    if(jiwei != 0){
	    	arrRes[length] = jiwei;
	    }
	    
	    /*
	    System.out.println("计算后的数组:");
        for(int i=0; i<arrRes.length;i++) {
            System.out.print(arrRes[i]);
        }  	   
        */

        //由上结果可以看出,找出倒数第一个非0位,然后逆向输出即是结果
        int index=0;
        for(int i=arrRes.length-1;i>=0 ;i--) {
            if(arrRes[i]!=0) {
            	index=i;//非0的倒数第一个位的数组索引
                break;
            }
        }

        //逆向输出结果 :  个十百千  -->  千百十个
        for(int i=index; i>=0;i--) {
            System.out.print(arrRes[i]);
        }  					
	}

}

测试结果

发布了462 篇原创文章 · 获赞 651 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/Czhenya/article/details/104548254