java 大整数加法

本文介绍如何在Java中处理大整数的加法,包括处理前导零、不同长度数字相加、进位等问题。通过将数字转化为字符串,然后以数组存储,最后进行进位和去除前导零的操作来得出结果。
摘要由CSDN通过智能技术生成

描述
求两个不超过200位的非负整数的和。
输入
有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
输出
一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
22222222222222222222
33333333333333333333
样例输出
55555555555555555555

一:在讲思路前我要先讲一下样例输入存在的
1.输入可能有很多个前导零
2.可能两行输入都是0
3.输入数据的长度可能不一致,相加时短的一方会越界
4.相加后的结果可能要进位

这里举两个例子:

1.有前导零,长度不一,存在进位

样例输入:
000666666
0777

样例输出: 667443

样例输入1

2.全零输入,长短不一

样例输入:
000000
000

样例输出:
0

全零输入
二:坑讲完了开始讲思路和方法
思路:
1.首先java中好像不支持超长整数直接进行运算(python可以),同时这道题属于一维数组题类。可见这道题的解法需要依靠数组
2.每一行输入的数字过长所以要以字符串的形式进行接收,然后巧妙的运用字符的ASCII码将字符数字转换成原本的数字存放进整型数组中
3.创建一个结果数组,用来存放两数组相加后的结果
4.最后对结果数组进行进位操作,并且结果数组中也存在前导零,这时就要进行前导零的扫描,直到扫到数字高位上不为零的那个下标,从该下标往数字的个位(数组的低位)方向进行输出

注意:数据输入时,存放时,相加时,输出时的次序及下标变化
1.数据输入时:最前面的数字会最先输入,数字的个位是最后被输入的
2.存放时:输入数字的个位,放进数组的最低位i=0,数组的第0位就是数字的个位,往高位方向依次表示十,百,千分位…
3.相加时:两数组先进行相加,将对应位相加的结果放进结果数组arradd[i]=arr1[i]+arr2[i]

小技巧:结果数组的下标默认index=0,考虑输入有000 0000的情况,相加完后,在扫描前导零时,if内的语句一直不被执行,直接输出结果数组的第0位,正好也是0。这样就省去了扫描前导零时,还需额外判断结果数组的最后一位是否仍然为0。

将结果数组进行前导零扫描(从数组最高位开始往数组的低位遍历,直到某位上的数值!=0,用index记录该下标)

4.输出时:输出的起点为结果数组的index~最低位,第一个不为零的数开始依次往个位数方向进行输出for(int i=index;i>=0;i–) ,最先输入的是数字的高分位,最后被输出的是数字的个位,和输入同理

方法:
1.先以字符串的形式接收数字,再以减ascii码的方式转成某一位上原本的数字,存进整型数组中(字符数字-字符’0’=字符数字原本的值)。arr1[i]=String1.charAt(len1-1-i)-‘0’;

2.数组的第一位(下标为0)是输入字符串数字的最后一位(个位),数组最低位做个位,依次升位,方便进位计算和去除前导零
注:可能输入的两行长度不一,则在相加时,短的一方会出现越界,所以初始化两数组长度时不能只是获取其对应字符串长度,而要取两字符串中最长的int len=Math.max(len1, len2);

3.数存到整数数组里,其没有被赋值的位(多出的位)默认值为0(这里利用了全局变量默认值是 0)。

4.进位处理:为防止相加进位而产生越界所以结果数组的长度要为原两数组的最长长度+1(int lenmax=len+1;)
从结果数组的最低位(数字的个位开始进行进位处理),最高分为不用遍历,它是相加结果最后被进到的那一位

 for(int i=0;i<lenmax-1;i++) {
   //lenmax-1,为结果的最高分位,如2+8=10,1存在的这一位就不用遍历了
		 arradd[i+1]=arradd[i+1]+arradd[i]/10;
		 arradd[i]=arradd[i]%10;
	 }

6.输出:扫描完前导零后,结果数组按index到最低位进行输出

ps:可能我说的有点绕,不过如果按着代码看一遍就差不多能懂我的意思了==

放一个带输出数据变化过程形式的代码,带关键注解并可以看到数字从储存、相加、进位、输出。每一步变化和次序

import java.util.*;
public class Main {
   
public static void main(String[] args) {
   
	   Scanner sc=new Scanner(System.in);
	  //以字符串形式接收数字,使的高精度数字得以存在
	 String String1,String2;
	 int len1,len2;
	 String1=sc.next();
	 String2=sc.next();
	 len1=String1.length();
	 len2=String2.length();
	 //可能输入的两行长度不一,则在相加时,短的一方会出现越界,所以初始化两数组长度时不能只是获取其对应字符串长度,而要取两字符串中最长的
	 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值