首页 > 试题广场 >

高精度整数加法

[编程题]高精度整数加法
  • 热度指数:143943 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}输入两个超大整数 a,b,计算它们的和。

输入描述:
\hspace{15pt}输入两个整数 a,b \left(0 \leqq a,b \lt 10^{10\,000}\right)


输出描述:
\hspace{15pt}输出一个整数,表示 ab 的和。
示例1

输入

9876543210
1234567890

输出

11111111100
模拟人的按位相加
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) { 
            String res="";
            String s1=in.nextLine();
            String s2=in.nextLine();
            int a=1,n1=s1.length(),n2=s2.length(),carry=0,temp=0;
            while(n1-a>=0||n2-a>=0){
                if(n1-a>=0&&n2-a>=0){
                    temp=Integer.parseInt(s1.charAt(n1-a)+"")+Integer.parseInt(s2.charAt(n2-a)+"")+carry;
                }else if(n1-a>=0){
                    temp=Integer.parseInt(s1.charAt(n1-a)+"")+carry;
                }else{
                    temp=Integer.parseInt(s2.charAt(n2-a)+"")+carry;
                }
                res=temp%10+res;
                carry=temp/10;
                a++;
            }
            if(carry!=0){
                res=carry+res;
            }
            System.out.println(res);
        }
    }
}


发表于 2025-04-05 17:20:37 回复(0)
import java.util.Scanner;
import java.util.Stack;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String a = in.nextLine();
        String b = in.nextLine();
        Stack<Integer> q = new Stack<>();
        //7774 + 8888  16662
        int c = a.length() - 1;
        int d = b.length() - 1;
        int jin = 0;
        int shi = 0;
        for (int i = 0; i < Math.max(a.length(), b.length()); i++) {
            if (c >= 0 && d >= 0) {
                shi = a.charAt(c) - '0' + b.charAt(d) - '0' + jin;
                //System.out.print(a.charAt(c) + "aaaaaaaaaaaaa");
                //System.out.print(b.charAt(d) + "bbbbbbbbbbbbb");
            } else if (c >= 0) {
                shi = a.charAt(c) - '0' + jin;
                //System.out.print(a.charAt(c) + "aaaaaaaaaaaaa");
            } else if (d >= 0) {
                shi = b.charAt(d) - '0' + jin;
                //System.out.print(b.charAt(d) + "bbbbbbbbbbbbb");
            }
            c--;
            d--;
            q.push(shi % 10);
            jin = shi / 10;
            //System.out.print(shi + "shishishishi");
            //System.out.println(jin + "jjjjjjjjjjjj");
            //12  shi=1 ge=2   4 -0 + 0-0 +ge
            //12 shi = 12   push shi%10  jin = shi/10   shi = 4+8+1 jin
        }
        if(shi>=10){
            q.push(shi/10);
        }
        while (!q.isEmpty()) {
            System.out.print(q.pop());
        }
    }
}
发表于 2025-03-21 00:49:36 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            char[] str1 = in.nextLine().toCharArray();
            char[] str2 = in.nextLine().toCharArray();

            int len1 = str1.length-1;
            int len2 = str2.length-1;

            String res = "";
            int shi = 0;
            while(true){
                int zhi = 0;
                if(len1>=0 && len2>=0){
                    zhi = str1[len1] - '0' + str2[len2] - '0' + shi;
                }else if(len1>=0){
                    zhi = str1[len1] - '0' + shi;
                }else if(len2>=0){
                    zhi = str2[len2] - '0' + shi;
                }else{
                    break;
                }
                int ge = zhi%10;
                shi = zhi/10;
                res = ge + res;
                len1--;
                len2--;
            }
            if(shi == 1){
                res = 1 + res;
            }
            System.out.println(res);

        }
    }
}

发表于 2025-02-20 11:03:30 回复(0)
import java.util.*;
import java.io.*;
import java.math.BigDecimal;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader bu = new BufferedReader(new InputStreamReader(System.in)  );
        // 注意 hasNext 和 hasNextLine 的区别
        // BigDecimal a = in.nextBigDecimal();
        //  BigDecimal b = in.nextBigDecimal();
        // System.out.println(a.add(b).toString());

        String a = bu.readLine();
        String b = bu.readLine();
        String[] arrA = a.split("");
        String[] arrB = b.split("");
        int jin = 0;
        StringBuilder str = new StringBuilder();
        if(a.length()>b.length()){
            cal(arrA, arrB, jin, a.length() - 1, b.length() - 1, str);
        }else{
            cal(arrB, arrA, jin, b.length() - 1, a.length() - 1, str);
        }
        bu.close();

    }
    public static void cal(String[] arrA, String[] arrB, int jin, int i, int j,
                           StringBuilder str) {
        if (i < 0 && jin == 0) {
            System.out.println(str.reverse());
        } else {
            int a = (i< 0) ? 0:Integer.parseInt(arrA[i]);
            int b = (j< 0) ? 0:Integer.parseInt(arrB[j]);
            Integer count = a + b +jin;

            if (count > 9) {
                jin = count / 10;
            }else{
                jin =0;
            }
            str.append(count%10);
            cal(arrA, arrB, jin, i-1, j-1, str);
        }

    }
}
可以用递归的方式,满10进1,加入下一次计算

发表于 2024-11-03 18:45:03 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String a = in.next();
        String b = in.next();
        while (a.length() > b.length()) {
            b = "0" + b;
        }
        while (b.length() > a.length()) {
            a = "0" + a;
        }
        String result = "";
        int cin = 0;
        for (int i = a.length()-1; i >= 0; i--) {
            int res = a.charAt(i)+b.charAt(i)+cin-96;
            cin = res / 10;
            result = res % 10 + result;
        }
        if (cin == 0) {
            System.out.print(result);
        } else {
            System.out.print(cin+result);
        }
    }
}
发表于 2024-09-29 16:33:23 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String a = in.nextLine(), b = in.nextLine();
        int m = a.length(), n = b.length();
        StringBuilder sb = new StringBuilder();
        int i = m - 1, j = n - 1;
        //判断两个数相加是否大于10,如果a,b长度相等的情况下最高位还要加1
        boolean carry = false;
        while ( i >= 0 || j >= 0 || carry) {
            //判断x是否大于a的lenght,如果大于则取0
            int x = i >= 0 ? a.charAt(i--) - '0' : 0;
            //判断y是否大于b的lenght,如果大于则取0
            int y = j >= 0 ? b.charAt(j--) - '0' : 0;
            int cur = x + y;
            //判断上次获得的数是否大于10,大于则加1
            if ( carry ) {
                cur ++;
                carry = false;
            }
            if ( cur >= 10 ) {
                cur %= 10;
                carry = true;
            }
            sb.append(cur);
        }
        System.out.println(sb.reverse().toString());
    }
}

发表于 2024-09-09 17:51:22 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] s = new StringBuilder(in.next()).reverse().toString().toCharArray();
        char[] ss = new StringBuilder(in.next()).reverse().toString().toCharArray();
        StringBuilder sb = new StringBuilder();
        int  jw = 0;  //进位初始化为0
        for(int i = 0;i<Math.max(s.length,ss.length);i++){
            if(i<s.length && i<ss.length){
                int temp = s[i]-'0' + ss[i] -'0' + jw;
                jw = temp/10;
                sb.append(temp%10);
            }else if(i <s.length){
                int temp = s[i] -'0' + jw;
                jw = temp/10;
                sb.append(temp%10);
            }else if(i <ss.length){
                int temp = ss[i] -'0' + jw;
                jw = temp/10;
                sb.append(temp%10);
            }
        }
        if(jw != 0){
            sb.append(jw);
        }
        System.out.println(sb.reverse());
    }
}

发表于 2024-09-08 18:19:11 回复(0)
import java.util.*;
import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str1 = in.nextLine();
        String str2 = in.nextLine();
        System.out.println(new BigDecimal(str1).add(new BigDecimal(str2)));
    }
}
发表于 2024-08-21 17:27:23 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        StringBuilder str1 = new StringBuilder(in.nextLine()).reverse();
        StringBuilder str2 = new StringBuilder(in.nextLine()).reverse();

        StringBuilder result = new StringBuilder();
        int len = Math.max(str1.length(), str2.length());
        int flag = 0;//表示进位的标志
        for (int i = 0; i < len; i++) {
            int a = 0, b = 0;
            if (i < str1.length()) {
                a = Integer.parseInt(str1.charAt(i) + "");
            }
            if (i < str2.length()) {
                b = Integer.parseInt(str2.charAt(i) + "");

            }
            int sum = a + b + flag;
            flag = sum / 10;//重置进位
            result.append(sum % 10);
        }
        if (flag != 0) {
            result.append(flag);
        }
        System.out.println(result.reverse());
    }
}

发表于 2024-07-07 16:37:15 回复(0)
不知道是JDK几,居然没有.repeat的
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String a = in.nextLine();
        String b = in.nextLine();
        char[] reversedA = new StringBuilder(a).reverse().toString().toCharArray();
        char[] reversedB = new StringBuilder(b).reverse().toString().toCharArray();
        if (a.length() > b.length()) {
            char[] temp = new char[a.length()];
            System.arraycopy(reversedB, 0, temp, 0, b.length());
            for (int i = b.length(); i < a.length(); i++) {
                temp[i] = '0';
            }
            reversedB = temp;
        } else {
            char[] temp = new char[b.length()];
            System.arraycopy(reversedA, 0, temp, 0, a.length());
            for (int i = a.length(); i < b.length(); i++) {
                temp[i] = '0';
            }
            reversedA = temp;
        }
        StringBuilder result = new StringBuilder();
        boolean carry = false;
        for (int i = 0; i < reversedA.length; i++) {
            int sum = reversedA[i] - '0' + reversedB[i] - '0';
            if (carry) {
                sum++;
                carry = false;
            }
            if (sum > 9) {
                carry = true;
                sum -= 10;
            }
            result.append(sum);
        }
        if (carry) {
            result.append(1);
        }
        System.out.println(result.reverse().toString());
    }
}


发表于 2024-06-23 21:43:24 回复(0)
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        String line2 = br.readLine();

        StringBuilder sb = new StringBuilder();

        StringBuilder sb1 = new StringBuilder(line);
        StringBuilder sb2 = new StringBuilder(line2);

        // 变为倒序
        String number1 = sb1.reverse().toString();
        String number2 = sb2.reverse().toString();

        // 计算每个位上的和
        // 进位的数字
        int jinwei = 0;
        int max = Math.max(line.length(), line2.length());
        for (int i = 0; i < max; i++) {
            int a = 0;
            if (i < line.length()) {
                a = Integer.parseInt(number1.charAt(i) + "");
            }

            int b = 0;
            if (i < line2.length()) {
                b = Integer.parseInt(number2.charAt(i) + "");
            }
            // 计算各位之和
            int sum = a + b + jinwei;
            // 计算进位的值
            jinwei = sum / 10;
            // 计算进位后的值
            sb.append(sum % 10);
        }

        // 补充最后的进位数字
        if (jinwei != 0) {
            sb.append(jinwei);
        }

        System.out.println(sb.reverse().toString());
    }
}

发表于 2023-08-10 15:59:51 回复(0)
import java.util.*;

import java.math.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        BigInteger num1=new BigInteger(in.nextLine());
        BigInteger num2=new BigInteger(in.nextLine());
        num1=num1.add(num2);
        System.out.print(num1);
    }
}

发表于 2023-06-02 16:57:52 回复(1)
import java.util.Scanner;
import java.math.BigDecimal;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        BigDecimal a = new BigDecimal(in.next());
        BigDecimal b = new BigDecimal(in.next());
        System.out.println(a.add(b));
    }
}

发表于 2023-06-01 14:53:09 回复(0)
 Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String a = in.next();
            String b = in.next();
            //Long最大值18E18,所以每18位给分割开
            int aLen = a.length();
            int bLen = b.length();
            StringBuffer bf = new StringBuffer();
            if(aLen>bLen){//将b前面加aLen-bLen个零
                for(int i=0;i<(aLen-bLen);i++){
                    bf.append("0");
                }
                bf.append(b);
                b = bf.toString();
            }else{ //将a前面加bLen-aLen个零
                 for(int i=0;i<(bLen-aLen);i++){
                    bf.append("0");
                }
                bf.append(a);
                a = bf.toString();
            }
            aLen =a.length();
            bLen = b.length();//重新计算a,b长度
            int aCount = aLen%18==0?(int)(aLen/18):(int)(aLen/18)+1;//a分成几段
            int bCount = bLen%18==0?(int)(bLen/18):(int)(bLen/18)+1;//b分成及段

            List<List<Long>> list = new ArrayList<List<Long>>();//返回总结果
            for(int i=0;i<aCount;i++){
                for(int j=0;j<bCount;j++){
                    if(i==j){ //同一段位相加求和
                        String aStr = "0";
                        String bStr = "0";
                        if(aLen%18==0){//18整数倍
                             aStr = a.substring(18*i,18*i+18);
                        }else{
                            if(i==0){
                                 aStr = a.substring(0,(int)(aLen%18));
                            }else{
                                 aStr = a.substring(18*(i-1)+(int)(aLen%18),18*i+(int)(aLen%18));
                            }
                        }
                        if(bLen%18==0){
                             bStr = b.substring(18*i,18*i+18);
                        }else{
                            if(j==0){
                                 bStr = b.substring(0,(int)(bLen%18));
                            }else{
                                 bStr = b.substring(18*(j-1)+(int)(bLen%18),18*j+(int)(bLen%18));
                            }
                        }
                        Long aLong = Long.parseLong(aStr);
                        Long bLong = Long.parseLong(bStr);
                        Long abLong = aLong+bLong;
                        List<Long> rstList = new ArrayList<Long>();
                        String abLongStr = String.valueOf(abLong);
                        int abLongLen = abLongStr.length();
                        if(abLongLen>18){//固定19位
                            rstList.add(Long.parseLong(abLongStr.substring(0,1)));//进位为第一位
                            rstList.add(Long.parseLong(abLongStr.substring(1,19)));
                        }else{
                            rstList.add(0L);//进位为0
                            rstList.add(abLong);
                        }
                        list.add(rstList);
                    }
                }
            }
            for(int i=0;i<list.size();i++){
                List<Long> temp = list.get(i);
                if(i!=list.size()-1){//除了最后一组,其它组的非进位数需要加下一组的进位数
                  Long ll =  (Long)temp.get(1)+(Long)list.get(i+1).get(0);
                  String llStr = String.valueOf(ll);
                  if(llStr.length()>18){
                        temp.set(0,temp.get(0)+Long.parseLong(llStr.substring(0,1)));//进制位修改
                        temp.set(1,Long.parseLong(llStr.substring(1,19)));//非进制位修改
                  }else{
                       temp.set(1,ll);;
                  }
                }
            }
            StringBuffer allBf = new StringBuffer();
            for(int i=0;i<list.size();i++){
                List<Long> temp = list.get(i);
                if(i!=0){ //除了第一组,其它的进制位都改为0。第一组之后的
                    temp.set(0,0L);
                    String jjStr = String.valueOf(temp.get(1));
                    StringBuffer tempBf = new StringBuffer();
                    if(jjStr.length()<18){
                        for(int j=0;j<(18-jjStr.length());j++){
                            tempBf.append("0");
                        }                        
                    }
                    tempBf.append(jjStr);
                    allBf.append(tempBf.toString());
                }else{
                    if(temp.get(0)!=0){
                        allBf.append(temp.get(0)).append(temp.get(1));
                    }else{
                        allBf.append(temp.get(1));
                    }
                   
                }
            }

            System.out.println(allBf.toString());
        }
发表于 2023-04-16 19:06:13 回复(0)
import java.util.*;
import java.io.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws Exception{
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = buf.readLine())!=null&&line.length()>0){
            //因为数据的长度可以最长达到1万个字符,因此不能用整型保存,应该用字符串保存相加结果
            System.out.println(add(line.trim(), buf.readLine().trim())); //trim表示去除字符串两端的空格
        }

    }
    private static String add(String s1, String s2){
        StringBuilder res = new StringBuilder(); //初始化一个可变字符串
        int n = s1.length()-1;
        int m = s2.length()-1;
        int carry = 0;//进位
        while(n>=0||m>=0){ //从两个字符串最后一位开始相加
            char c1 = n>=0?s1.charAt(n--):'0';
            char c2 = m>=0?s2.charAt(m--):'0';
            int sum = (c1-'0')+(c2-'0')+carry;
            res.append(sum%10);
            carry = sum/10;
        }
        if(carry==1) res.append(carry);
        return res.reverse().toString();  //转换成字符串String类型
    }
}

发表于 2023-04-09 12:14:22 回复(0)
import java.util.*;
import java.math.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            BigDecimal a = new BigDecimal(in.next());
            BigDecimal b = new BigDecimal(in.next());
            System.out.println(a.add(b));
        }
    }
}

发表于 2023-03-14 22:34:36 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String a = in.nextLine(), b = in.nextLine();
        int m = a.length(), n = b.length();
        StringBuilder sb = new StringBuilder();
        int i = m-1, j = n-1;
        boolean carry = false;
        while ( i >= 0 || j >= 0 || carry ) {
            int x = i >=0 ? a.charAt(i--)-'0' : 0;
            int y = j >= 0 ? b.charAt(j--)-'0' : 0;
            int cur = x + y;
            if ( carry ) {
                cur ++;
                carry = false;
            }
            if ( cur >= 10 ) {
                cur %= 10;
                carry = true;
            }
            sb.append(cur);
        }
        System.out.println(sb.reverse().toString());
    }
}

发表于 2023-03-12 16:31:12 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String numStr1 = in.next();
            String numStr2 = in.next();
            String numLongStr = numStr1.length() >= numStr2.length() ? numStr1 : numStr2;
            String numShortStr = numStr1.length() < numStr2.length() ? numStr1 : numStr2;
            StringBuffer sf = new StringBuffer();
            for (int i = 0; i < numLongStr.length() - numShortStr.length(); i++) {
                sf.append("0");
            }
            numShortStr = sf + numShortStr;
            String[] numLongStrArray = numLongStr.split("");
            String[] numShortStrArray = numShortStr.split("");
            int[] arr = new int[numLongStr.length() + 1];
            arr[0] = 0;  //在最前面多加一个0,可能进位
            for (int i = 1; i <= numLongStr.length(); i++) {
                arr[i] = Integer.parseInt(numLongStrArray[i - 1]) + Integer.parseInt(
                             numShortStrArray[i - 1]);
            }
            getNewArray(arr, arr.length - 1);
            StringBuffer outStr = new StringBuffer();
            for (int i = 0; i < arr.length; i++) {
                outStr.append(arr[i]);
            }
            if (outStr.toString().charAt(0) == '0') {
                System.out.println(outStr.toString().substring(1));
            } else {
                System.out.println(outStr);
            }
            break;
        }

    }

    private static int[] getNewArray(int[] arr, int index) {
        if (index == 0) {
            return arr;
        } else {
            if (arr[index] >= 10) {
                arr[index] = arr[index] % 10;
                arr[index - 1] = arr[index - 1] + 1;
            }
            index--;
            return getNewArray(arr, index);
        }
    }
}
发表于 2023-03-06 00:28:29 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s1 = sc.nextLine();
        String s2 = sc.nextLine();
        // s1、s2的最大下标
        int m = s1.length() - 1;
        int n = s2.length() - 1;
        // 进位
        int carry = 0;
        // 逆序遍历相加
        StringBuilder builder = new StringBuilder();
        while (m >= 0 || n >= 0) {
            char c1 = m >= 0 ? s1.charAt(m--) : '0';
            char c2 = n >= 0 ? s2.charAt(n--) : '0';
            int sum = (c1 - '0') + (c2 - '0') + carry;
            builder.append(sum % 10);
            carry = sum / 10;
        }
        // 事实上carry只可能为0或1
        if (carry != 0) {
            builder.append(carry);
        }
        // 反转输出
        System.out.println(builder.reverse().toString());
    }
}

发表于 2023-02-27 10:46:43 回复(0)
做了一晚上,最短的一个了,,,记录一下
import java.io.*;
import java.math.BigInteger;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s;
        while ((s = br.readLine()) != null) {
            BigInteger num1 = new BigInteger(s);
            BigInteger num2 = new BigInteger(br.readLine());
            System.out.println(num1.add(num2));
        }
    }
}


发表于 2022-09-29 23:13:17 回复(0)