蓝桥杯 高精度加法 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

这道题我先写了好长时间的数组解法,涉及到无数行代码,还有逻辑思维,我受够了,不行直接上大数类

先看传统方法

package 蓝桥杯题库;

import java.util.Scanner;
import java.lang.StringBuilder;

public class 高精度加法 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		
		char[] a=new char[100];
		char[] b=new char[100];
		String c;
		
		a=new StringBuilder(sc.next()).reverse().toString().toCharArray();//输入两个数,把它们反向并从字符串转化为字符数组
		b=new StringBuilder(sc.next()).reverse().toString().toCharArray();
		sc.close();
		c=new StringBuilder(plus(a,b)).reverse().toString();//plus是我写的方法,因为我们把 a,b反向了,还得返回去,然后由字符数组转化为字符串(我的plus返回的是字符串)
		char[] ans=c.toCharArray();//不能直接输出字符串,因为字符串数组默认长度是101,高位为“\0",必须去掉
		int index=0;
		//寻找第一个不是"\0"和'0'位置,
		for (int i = 0; i < ans.length; i++) {
			if(ans[i]!='\0'&&ans[i]!='0') {
				index=i;
				break;
			}
		}
		//依次打印结果中的字符串
		for (int i = index; i < ans.length; i++) {
			
				System.out.print(ans[i]);
		}
		
	}
	//plus函数
	private static String plus(char[] a, char[] b) {
		char[] c=new char[101];
		int r=0;
		//如果a和b的长度相等
		if(a.length==b.length) {
			for (int i = 0; i < a.length; i++) {
				//各个位相加,注意字符'0'转化位int型是48,我们必须消除该影响,同时,结果也要+48
				c[i]=(char) (((a[i]+b[i]-'0'*2+r)%10)+48);
				//每一位加法都是,a,b的两个位相加,同时加进位r,(r==0||r==1)
				if(a[i]+b[i]+r-'0'*2>9) {
					r=1;
				}
				else 
					r=0;
			}
			//最高位直接加进位r,如果r==0,我们不能打印该数,所以必须判断ans[i]!='0'
			c[a.length]=(char) (r+48);
		}
		//如果a比b位大
		//先处理一样位的,和上面方法相同
		if(a.length>b.length) {
			for (int i = 0; i < b.length; i++) {
				c[i]=(char) (((a[i]+b[i]-'0'*2+r)%10)+48);
				if(a[i]+b[i]-'0'*2+r>9) {
					r=1;
				}
				else 
					r=0;
			}
			//后面可以直接把a的相应数字赋值给c,但考虑到在第b.length位,a+b可能进位,我们还得加r;比如99999+1,将会引发a的每一位进位
			for (int i = b.length; i < a.length; i++) {
				c[i]=(char) ((a[i]+r-'0')%10+48);
				
				if(a[i]+r-'0'>9) {
					r=1;
				}
				else 
					r=0;
			}
			同样
			c[a.length]=(char) (r+48);
		}
		//b的位长于a
		if(b.length>a.length) {
			for (int i = 0; i < a.length; i++) {
				c[i]=(char) (((a[i]+b[i]-'0'*2+r)%10)+48);
				if(a[i]+b[i]-'0'*2+r>9) {
					r=1;
				}
				else 
					r=0;
			}
			//System.out.println(r);
			for (int i = a.length; i < b.length; i++) {
				c[i]=(char) ((b[i]+r-'0')%10+48);
				if(b[i]+r-'0'>9) {
					r=1;
				}
				else 
					r=0;
			}
			c[b.length]=(char) (r+48);
		}
		return new String(c);
	}
}

再看大数算法

package 一月十六;
//大数在math中
import java.math.*;
import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		BigInteger a,b,c;
		a=sc.nextBigInteger();
		b=sc.nextBigInteger();
		c=a.add(b);//java自带方法a+b
		System.out.println(c);
		sc.close();
		
	}
}

Java的大数类真是个好东西,具体方法可以看这里:
Java大数类方法

发布了8 篇原创文章 · 获赞 4 · 访问量 1173
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览