给定两个非常大的正整数A和B,位数在50至100之间。求C=A+B;
输入: | 因为A和B很大,从高位到低位,以字符串的形式输入两行数字A和B。A和B的位数在50至100之间。 |
输出: | 以字符串形式,输出一行,表示A和B的和。 |
样例输入: | 11111111111111111111111111111111111111111111111111 22222222222222222222222222222222222222222222222222 |
样例输出: | 33333333333333333333333333333333333333333333333333 |
思路上应该不难,做的时候得注意很多细节,先上程序
import java.util.*;
public class Huawei {
public static void main(String args[]){
Scanner n = new Scanner(System.in);
String a="";
String b="";
//读取控制台输入字符串
a=n.nextLine();
b=n.nextLine();
// System.out.println(a);
// System.out.println(b);
//获取字符串a,b的长度
int aLength=a.length();
int bLength=b.length();
//定义最终结果字符串长度
int length=0;
//最终字符串的长度是a,b中较长字符串长度+1
if(aLength>=bLength){
length=aLength+1;
}else {
length=bLength+1;
}
//先将结果放到整形数组中,然后再转换
int[] resultc = new int[length];
int c=0;
int bb=0;
int aa=0;
while(length>1){
aa=0;bb=0;
//这里因为不确定a,b字符串哪个比较短,所以在某一个字符串加完的情况下自动用0代替。相当于将两个字符串都看作为较长字符串的长度,不够位用0补齐
if(bLength>0){
bb=Integer.valueOf(b.charAt(bLength-1)+"");
}
if(aLength>0){
aa=Integer.valueOf(a.charAt(aLength-1)+"");
}
//System.out.println("aa----"+aa+" bb-----"+bb);
c=aa+bb;
//计算出了进位后的数,再加上它前面数的进位
resultc[length-1]+=c%10;
//进位值
resultc[length-2]=c/10;
length--;
aLength--;
bLength--;
}
String result="";
//如果结果数组的0位置的值是0,得判断舍弃
int i =0;
if(resultc[0]==0){
i=1;
}
for(;i<resultc.length;i++){
result+=resultc[i];
}
System.out.println(result);
}
}
注意点:
- 在两个字符串按位相加的时候,得考虑到某一个字符串先加完,然后用0补齐
- 字符串某一位字符转int型的时候应该是这样:
Integer.valueOf(a.charAt(aLength-1)+"");写成<pre name="code" class="java" style="font-size: 14px;">Integer.valueOf(a.charAt(aLength-1));就完全是两种答案,因为chartAt函数返回的是一个char类型,得把他变成String类型才能正确的转换
最后,结果数组的0位有可能是1也有可能是0,转成字符串的时候应该做处理。