蓝桥杯--高精度加法

问题描述
  输入两个整数 ab,输出这两个整数的和。 ab都不超过100位。
算法描述
  由于 ab都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组 AA[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输出即可。


package com.xjj.lanqiao;

import java.util.Scanner;

/*----大数据相加--高精度
 * 
 * */
public class Lq2_29 {
	//大数据类--结构体
	class bign{
		int[] num = new int[200];
		int len = 0;
	}

	bign a = new bign();
	bign b = new bign();
	
	//高精度相加
	public void add(bign a, bign b){
		bign c = new bign();			//暂存
		int carry = 0;					//进位
		
		//遍历每位数组,找最长数组
		for(int i = 0; i < a.len || i < b.len; i++){
			//每位数组相加在加上进位
			int temp = a.num[i] + b.num[i] + carry;
			c.num[c.len++] = temp % 10;		//求模得个位
			carry = temp / 10;				//相除得进位,最多进一位
		}
		//最多进一位
		if (carry != 0) 
			c.num[c.len++] = carry;
		
		//高位到低位输出
		for(int i = c.len - 1; i >= 0; i--){
			System.out.print(c.num[i]);
		}
	}
	public static void main(String[] args) {
		System.out.println();
		Scanner scanner = new Scanner(System.in);
		Lq2_29 lq = new Lq2_29();
		
		String str1 = scanner.nextLine();
		String str2 = scanner.nextLine();
		//将字符转换为数组
		char[] csa = str1.toCharArray();
		char[] csb = str2.toCharArray();
		int lena = csa.length;
		int lenb = csb.length;
		//将char[] 转换为  int[]
		//必须记得是数组高位存数值高位,即 i 必须从 len-1 开始
		for(int i = lena - 1; i >= 0; i--){
			lq.a.num[lq.a.len++] = csa[i] - '0';
		}
		for(int i = lenb - 1; i >= 0; i--)
			lq.b.num[lq.b.len++] = csb[i] - '0';

		lq.add(lq.a, lq.b);
	}

}

你可能感兴趣的:(算法,蓝桥杯)