思路
将两个数字从小数点处分开
前段和后段分别相加
处理小数点处的进位操作
相加之后,和小数点拼接返回
细节都在代码中注释
代码实现
import java.util.Scanner;
public class Adder {
/**
* 两个大正数相加
* @param num1
* @param num2
* @return
*/
private static String add(String num1, String num2) {
//将两个字符串拆分成前后两端
//前半段和前半段相加...
int dot1=num1.length();
for (int i=0;i<num1.length();i++){
if(num1.charAt(i)=='.'){
dot1=i;
}
}
String before1=num1.substring(0,dot1);
String half1="";
if(dot1!=num1.length()){
half1=num1.substring(dot1+1);
}
int dot2=num2.length();
for (int i=0;i<num2.length();i++){
if(num2.charAt(i)=='.'){
dot2=i;
}
}
String before2=num2.substring(0,dot2);
String half2="";
if(dot2!=num2.length()){
half2=num2.substring(dot2+1);
}
//小数点之后相加
String s2=addHalf(half1,half2);
//小数点之后相加
String s1=addPart(before1,before2);
//小数点处的进位操作
if(s2.length()>Math.max(half1.length(),half2.length())&&
s2.charAt(0)=='1'){
s2=s2.substring(1);
char c=(char)(s1.charAt(s1.length()-1)+1);
s1=s1.substring(0,s1.length()-1);
s1=s1+c;
}else if(s2.length()>Math.max(half1.length(),half2.length())&&
s2.charAt(0)=='0'){
s2=s2.substring(1);
}
//对结果做一个去0操作并返回
return trimZ(s1+"."+s2);
}
/**
* 相加操作
* @param num1
* @param num2
* @return
*/
public static String addPart(String num1,String num2){
if(num1.length()==0||num2.length()==0){
return num1.length()==0?num2:num1;
}
char[] a1=num1.toCharArray();
char[] a2=num2.toCharArray();
int[] all=new int[Math.max(a1.length,a2.length)+1];
int jin=0;//进位
int i=a1.length-1;
int j=a2.length-1;
int k=all.length-1;
while (i>=0||j>=0){
if(j>=0&&i>=0){
int add=a1[i--]-'0'+a2[j--]-'0'+jin;
jin=0;
if(add>=10){
jin=1;
all[k--]=add%10;
}else {
all[k--]=add;
}
}else if(j>=0){
int add=a2[j--]-'0'+jin;
jin=0;
if(add>=10){
jin=1;
all[k--]=(add%10);
}else {
all[k--]=add;
}
}else {
int add=a1[i--]-'0'+jin;
jin=0;
if(add>=10){
jin=1;
all[k--]=add%10;
}else {
all[k--]=add;
}
}
}
if(jin==1){
all[0]=1;
}else {
all[0]=0;
}
StringBuffer sb=new StringBuffer();
for (int a=0;a<all.length;a++){
sb.append(all[a]);
}
return sb.toString();
}
/**
* 后半段相加操作
* @param num1
* @param num2
* @return
*/
public static String addHalf(String num1,String num2){
if(num1.length()==num2.length()){
return addPart(num1,num2);
}
if(num1.length()==0||num2.length()==0){
return num1.length()==0?num2:num1;
}
String min=num1;
String max=num1;
if(num1.length()>=num2.length()){
min=num2;
}
if(num1.length()<=num2.length()){
max=num2;
}
for(int i=min.length()-1;i<max.length()-1;i++){
min=min+"0";
}
return addPart(min,max);
}
/**
* 去掉多余的0
* @param str
* @return
*/
public static String trimZ(String str){
if(str==null||str.length()<1){
return "";
}
int i=0;
int j=str.length()-1;
//从左向右去0
while (i<str.length()&&str.charAt(i)=='0'){
i++;
}
//从右向左去0
while (j>=0&&str.charAt(j)=='0'){
j--;
}
if(str.charAt(i)=='.'){
i--;
}
if(str.charAt(j)=='.'){
j--;
}
//只去右边的0
return str.substring(i,j+1);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String num1 = sc.nextLine();
String num2 = sc.nextLine();
String sum = add(num1, num2);
System.out.println(sum);
}
}