首页 > 试题广场 >

高精度整数加法

[编程题]高精度整数加法
  • 热度指数:127876 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入两个用字符串 str 表示的整数,求它们所表示的数之和。

数据范围:

输入描述:

输入两个字符串。保证字符串只含有'0'~'9'字符



输出描述:

输出求和后的结果

示例1

输入

9876543210
1234567890

输出

11111111100
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            String[] strings = new String[2];
            strings[0] = scanner.next();
            strings[1] = scanner.next();
            StringBuilder result = new StringBuilder();
            if (strings[0].length() < strings[1].length()){
                String temp = strings[0];
                strings[0] = strings[1];
                strings[1] = temp;
            }
            int num2Index = strings[1].length()-1;
            int addOn = 0;
            for (int i = strings[0].length()-1; i >= 0; i--){
                int sumOfOneDigit = Integer.parseInt(strings[0].substring(i,i+1));
                if (num2Index >= 0){
                    sumOfOneDigit += Integer.parseInt(strings[1].substring(num2Index,num2Index+1)) + addOn;
                }else{
                    sumOfOneDigit += addOn;
                }
                addOn = sumOfOneDigit >= 10 ? 1 : 0;
                String sum = String.valueOf(sumOfOneDigit);
                if (i > 0){
                    result.append(sum.substring(sum.length()-1,sum.length()));
                }else{
                    result.append(new StringBuilder(sum).reverse().toString());
                }
                num2Index -= 1;
            }
            System.out.println(result.reverse().toString());
        }
    }
}

发表于 2021-01-18 23:48:56 回复(1)
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
    string str1, str2, str_out;
    while(cin >> str1 >> str2) {
        if((str1[0] != '-' && str2[0] != '-') || (str1[0] == '-' && str2[0] == '-')) {
            bool flag = false;
            if(str1[0] == '-') {
                str1.erase(0, 1);
                str2.erase(0, 1);
                flag = true;
            }
            str_out = str1.length() >= str2.length()? str1 : str2;
            int temp1, temp2, temps; int ups = 0;
            int len_s1 = str1.size() - 1, len_s2 = str2.size() - 1, len_sout;
            while(len_s1 >= 0 && len_s2 >= 0) {    
                temp1 = (str1[len_s1] - '0');
                temp2 = (str2[len_s2] - '0');
                temps = temp1 + temp2 + ups;
                ups = 0;
                len_sout = max(len_s1, len_s2);
                str_out[len_sout] = '0' + temps % 10;
                if(temps >= 10) {
                    if (len_sout != 0) {
                        ups = 1;
                    } else {
                        str_out.insert(0, 1, '1');
                    }
                }
            len_s1 --; len_s2 --;
            }
            len_sout --;
            if(len_sout >= 0 && ups == 1) {
                while(len_sout >= 0) {
                    if (str_out[len_sout] - '0' + ups >= 10) {
                        str_out[len_sout] = '0' +(str_out[len_sout] - '0' + ups) % 10;
                        if (len_sout != 0) {
                            ups = 1;
                        } else {
                            str_out.insert(0, 1, '1');
                        }    
                    }
                    else {
                        str_out[len_sout] = str_out[len_sout] + 1;
                        ups = 0;
                        break;
                    }
                    len_sout --;
                }
            }
            if(flag) {
                str_out.insert(0, 1, '-');
            } 
        } else {
            bool flag = false;
            if(str1[0] == '-') {
                flag = true;
                str1.erase(0, 1);
            } else {
                str2.erase(0, 1);  
            }
            if(str1.length() > str2.length()) {
                str_out = str1;
            }  else if(str1.length() < str2.length()) {
                str_out = str2;
                str2 = str1;
                str1 = str_out;
                flag = !flag;
            } else {
                for(int i = 0; i < str1.length(); i++) {
                    if(str1[i] > str2[i]) {
                        str_out = str1;
                        break;
                    } else if (str1[i] < str2[i]) {
                        str_out = str2;
                        str2 = str1;
                        str1 = str_out;
                        flag = !flag;
                        break;
                    } else if( i == str1.length() - 1 && str1[i] == str2[i]) {
                        str_out = str1;
                        flag = false;
                        break;
                    }
                }
            }
            int len_s1 = str1.size() - 1, len_s2 = str2.size() - 1;
            int temp1, temp2, temps; int ups = 0;
            while(len_s1 >= 0 && len_s2 >= 0) {
                temp1 = (str1[len_s1] - '0');
                temp2 = (str2[len_s2] - '0');
                if(temp1 - temp2 + ups >= 0){
                    temps = temp1 - temp2 + ups;
                    ups = 0;
                } else {
                    temps = temp1 - temp2 + ups + 10;
                    ups = -1;
                }
                str_out[max(len_s1, len_s2)] = '0' + temps;
                len_s1 --; len_s2 --;
            }
            while(ups == -1) {
                if(str_out[len_s1] + ups >= '0') {
                    str_out[len_s1] = str_out[len_s1] + ups;
                    ups = 0;
                    break;
                } else {
                    str_out[len_s1] = str_out[len_s1] + ups + 10;
                    ups = -1;
                }
                len_s1 --;
            }
            while(str_out[0] == '0' && str_out.length() > 1) {
                str_out.erase(0, 1);
            }
            if(flag) {
                str_out.insert(0, 1, '-');
            }
        }
        cout << str_out << endl;
    }
    system("pause");
    return 0;
}
//写的很乱 坑有很多
//加法减法的设计
//进位符 借位符的设计(为零时才跳出) 9999 + 1 这种
//减法要设计大的数在前 小的数在后 
//最后要去零
发表于 2018-10-21 20:12:04 回复(1)
字符串拼接就可以了,最后两个字符串走完了也要判断一下是否有剩的进位。
运行时间:14ms
超过91.54% 用Java提交的代码
占用内存:9508KB
超过98.34%用Java提交的代码
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str1 = br.readLine(), str2 = br.readLine();
        int len1 = str1.length(), len2 = str2.length();
        StringBuilder sb = new StringBuilder();
        int carry = 0;
        while (len1 != 0 || len2 != 0 || carry != 0) {
            int num1 = len1 != 0 ? str1.charAt(--len1) - '0' : 0;
            int num2 = len2 != 0 ? str2.charAt(--len2) - '0' : 0;
            int sum = num1 + num2 + carry;
            sb.append(sum % 10);
            carry = sum / 10;
        }
        System.out.println(sb.reverse());
    }
}



发表于 2022-08-12 18:45:03 回复(1)
//分享一个C++版本的吧,写得比较蠢,不过思路还是蛮清晰的
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
    string s1, s2;
    cin >> s1 >> s2;
 string res;
    reverse(s1.begin(), s1.end());
    reverse(s2.begin(), s2.end());
    int n = s1.size() > s2.size() ? s1.size() : s2.size();
    int flag = 0;
    for(int i = 0; i < n; i++){
        if(i < s1.size() && i < s2.size()){
            if(flag + s1[i] - '0' + s2[i] - '0' < 10){
                res.push_back(char(flag + '0' + s1[i] - '0' + s2[i] - '0'));
                flag = 0;
            }
            else{
                res.push_back(char('0' + (flag + s1[i] - '0' + s2[i] - '0') % 10));
                flag = 1;
            }
        }
        else if(i >= s1.size()){
            if(flag + s2[i] - '0'< 10){
                res.push_back(char(s2[i] + flag));
                flag = 0;
            }
            else{
                res.push_back(char('0' + (flag + s2[i] - '0') % 10));
                flag = 1;
            }
        }
        else{
            if(flag + s1[i] - '0'< 10){
                res.push_back(char(s1[i] + flag));
                flag = 0;
            }
            else{
                res.push_back(char('0' + (flag + s1[i] - '0') % 10));
                flag = 1;
        }
    }
    }
    if(flag == 1) res.push_back('1');      
    reverse(res.begin(), res.end());
    cout << res;
}

发表于 2022-07-10 15:59:49 回复(0)
// 运行时间:4ms
// 超过31.29% 用C++提交的代码
// 占用内存:408KB
// 超过75.91%用C++提交的代码


#include <bits/stdc++.h>


int main() {
    std::string input_string_a, input_string_b;
    while (std::cin >> input_string_a >> input_string_b) {
        char result[10001] = {0};
//         printf("%s, %s\n", input_string_a.c_str(), input_string_b.c_str());
        reverse(input_string_a.begin(), input_string_a.end());
        reverse(input_string_b.begin(), input_string_b.end());
//         printf("%s, %s\n", input_string_a.c_str(), input_string_b.c_str());
        int len_input_string_a = strlen(input_string_a.c_str());
        int len_input_string_b = strlen(input_string_b.c_str());
        int max_len = 0, min_len = 0;
        std::string string_c = "";
        if (len_input_string_a > len_input_string_b) {
            max_len = len_input_string_a;
            min_len = len_input_string_b;
            string_c = input_string_a.substr(min_len, max_len);
        }
        else {
            max_len = len_input_string_b;
            min_len = len_input_string_a;
            string_c = input_string_b.substr(min_len, max_len);
        }
//         printf("%s\n", string_c.c_str());
        for (int i=0; i<min_len; ++i) {
            char tmp = (input_string_a[i] - 48) + (input_string_b[i] - 48) + result[i];
            
            if (tmp >= 10) {
                result[i+1] += (tmp / 10);
                result[i] = tmp % 10;
            }
            else {
                result[i] = tmp % 10;
            }
//             printf("%d ", tmp);
        }
        int len_string_c = strlen(string_c.c_str());
        for (int i=0; i<len_string_c; ++i) {
            result[i+min_len] += string_c[i] - 48;
            int tmp = result[i+min_len];
            if (tmp >= 10) {
                result[i+min_len] = tmp % 10;
                result[i+min_len+1] = tmp / 10;
            }
        }
//         printf("\n");
        bool *** = false;
        for (int i=10000; i>=0; --i) {
            if (result[i] != 0) {
                *** = true;
            }
            if (***) printf("%d", result[i]);
        }
        if (!***) {
            printf("0");
        }
        printf("\n");
    }
    return 0;
}

发表于 2021-08-08 19:38:51 回复(0)
使用bigDecimal
import java.util.*;
import java.math.*;

//注意bigDecimal所在的包   记住javac常用类所在的包
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        while(scan.hasNext()){
            BigDecimal b1 = new BigDecimal(scan.next().trim());
            BigDecimal b2 = new BigDecimal(scan.next().trim());
            System.out.println(b1.add(b2));
        }
    }
    
}


发表于 2021-08-05 21:37:52 回复(0)
//54-45=54+(100-45)-100
#include<iostream>
using namespace std;
string func(string a,string b)
{
    string ans="";
    if(a[0]=='-'&&b[0]=='-')
    {
        if(a.size()>b.size()) swap(a,b);
        int la=a.size(),lb=b.size();
        int jw=0;
        for(int i=la-1,pos=lb-1;pos>0;i--,pos--)
        {
            int num;
            if(i>0) num=a[i]-'0'+b[pos]-'0'+jw;
            else num=b[pos]-'0'+jw;
            char c='0'+num%10;
            jw=num/10;
            ans=c+ans;
        }
        if(jw=1) ans="-1"+ans;
        else ans='-'+ans;
    }
    else if(a[0]=='-'||b[0]=='-')
    {
        int abig=0;
        char sign;
        if(b[0]=='-') swap(a,b);
        if(a.size()-1>b.size()) abig=1;
        else if(a.size()-1<b.size()) abig=0;
        else 
        {
            for(int i=1,j=0;i<a.size();i++,j++)
            {
                if(a[i]>b[j])
                {
                    abig=1;
                    break;
                }
                if(a[i]<b[j])
                {
                    abig=0;
                    break;
                }
                if(i==a.size()-1) abig=2;
            }
        }
        a.erase(0,1);
        if(abig==2) ans="0";
        else{
        	if(abig==1) swap(a,b);
            int la=a.size(),lb=b.size(),f=0;
            for(int i=la-1;i>=0;i--)
            {
                if(f==0&&a[i]!=0)
                {
                    a[i]=10-(a[i]-'0')+'0';
                    f=1;
                }
                else if(f==1)
                {
                    a[i]=9-(a[i]-'0')+'0';
                }
            }
            int jw=0;
            for(int i=la-1,pos=lb-1;pos>=0;i--,pos--)
            {
                int num;
                if(i>=0) num=a[i]-'0'+b[pos]-'0'+jw;
                else num=b[pos]-'0'+jw;
                char c='0'+num%10;
                jw=num/10;
                ans=c+ans;
            }
            while(1)
            {
                if(ans[0]!='0') break;
                else ans.erase(0,1);
            }
        } 
    }
    else
    {
        if(a.size()>b.size()) swap(a,b);
        int la=a.size(),lb=b.size();
        int jw=0;
        for(int i=la-1,pos=lb-1;pos>=0;i--,pos--)
        {
            int num;
            if(i>=0) num=a[i]-'0'+b[pos]-'0'+jw;
            else num=b[pos]-'0'+jw;
            char c='0'+num%10;
            jw=num/10;
            ans=c+ans;
        }
        if(jw==1) ans='1'+ans;
    }
    return ans;
}
int main()
{
    string a,b;
    while(cin>>a>>b)
    {
        cout<<func(a,b)<<endl;
    }
}

编辑于 2020-08-18 11:24:03 回复(2)
//思路:先判断-号的,情况,都为 - ,输出为 - ,其中一个为 -,就要判断是负数大还是负数小
//进行add 和sub函数的编写,要考虑相加后高位的位数会增加1为, 相减,高位可能会少1位或多位
发表于 2020-07-18 10:48:34 回复(0)
public class Main{
    public static void main(String[] args) {
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        while (scanner.hasNext()){
            char[] inputValue1 = scanner.next().toCharArray();
            char[] inputValue2 = scanner.next().toCharArray();
            char flagInputValue1 = inputValue1[0];
            char flagInputValue2 = inputValue2[0];
            String result;
            if(flagInputValue1 == '-' && flagInputValue2== '-'){
                result = cal( java.util.Arrays.copyOfRange(inputValue1, 1, inputValue1.length),  java.util.Arrays.copyOfRange(inputValue2, 1, inputValue2.length),
                        '+');
                result = "-" + result;
            }else if(flagInputValue1 != '+' && flagInputValue1 != '-' && flagInputValue2== '-'){
                result = cal(inputValue1,  java.util.Arrays.copyOfRange(inputValue2, 1, inputValue2.length),
                        '-');
            }else if(flagInputValue2 != '+' && flagInputValue2 != '-' && flagInputValue1 == '-'){
                result = cal(inputValue2,  java.util.Arrays.copyOfRange(inputValue1, 1, inputValue1.length),
                        '-');
            }else {
                result = cal(inputValue1,  inputValue2, '+');
            }
            System.out.println(result);
        }
    }

    public static String cal(char[] inputStrChar1, char[] inputStrChar2, char signChar){
        String ret;
        int maxLength = Math.max(inputStrChar1.length, inputStrChar2.length);
        int minLength = Math.min(inputStrChar1.length, inputStrChar2.length);
        int diff = maxLength - minLength;
        if(signChar == '-'){
            if(inputStrChar1.length >= inputStrChar2.length){
                ret = sub(inputStrChar1, inputStrChar2, maxLength, diff);
            }else {
                ret = sub(inputStrChar2, inputStrChar1, maxLength, diff);
                ret = "-" + ret;
            }
        }else {
            if(inputStrChar1.length < inputStrChar2.length){
                ret = add(inputStrChar1, inputStrChar2, maxLength, diff);

            }else {
                ret = add(inputStrChar2, inputStrChar1, maxLength, diff);
            }
        }
        return ret;
    }

    public static String sub(char[] inputNum1, char[] inputArr2, int maxLength, int diff){
        StringBuilder stringBuffer = new StringBuilder();
        int flagAdd = 0;
        for(int i = maxLength - 1; i >= 0; i--){
            int tmp;
            if(i - diff >= 0){
                tmp = inputArr2[i] - inputNum1[i - diff];
            }else {
                tmp = inputArr2[i] - 48;
            }
            tmp = tmp - flagAdd;
            flagAdd = 0;
            if(tmp < 0 && i > 0){
                tmp = 10 + tmp;
                flagAdd = 1;
            }
            if (tmp != 0 || i != 0) {
                if(tmp < 0){
                    stringBuffer.append(-tmp).append("-");
                }else {
                    stringBuffer.append(tmp);
                }
            }
        }
        return stringBuffer.reverse().toString();
    }

    public static String add(char[] inputNum1, char[] inputArr2, int maxLength, int diff){
        StringBuilder stringBuffer = new StringBuilder();
        int flagAdd = 0;
        for(int i = maxLength - 1; i >= 0; i--){
            int tmp = 0;
            if(i - diff >= 0){
                tmp = inputArr2[i] + inputNum1[i - diff] - 96;
            }else {
                tmp = inputArr2[i] - 48;
            }
            tmp = tmp+flagAdd;
            flagAdd = tmp / 10;
            tmp = tmp % 10;
            stringBuffer.append(tmp);
        }
        if(flagAdd != 0){
            stringBuffer.append(flagAdd);
        }
        return stringBuffer.reverse().toString();
    }

}

发表于 2020-03-29 12:55:22 回复(0)
题目不难,归纳一下就加减两种运算,但如何加减的次序是关键,就是要细分的情况有点多。
#include <iostream>
#include <string>
#include <map>
using namespace std;
map<char, int> mm = { { '0', 0 }, { '1', 1 }, { '2', 2 }, { '3', 3 }, \
{ '4', 4 }, { '5', 5 }, { '6', 6 }, { '7', 7 }, { '8', 8 }, { '9', 9 } };
//补齐后相同长度位数相加
string add(string s1, string s2)
{
    string res;   int tmp, benwei, jinwei = 0;//本位与进位   for (int i = s1.size()-1; i >= 0; i--){    tmp = mm[s1[i]] + mm[s2[i]] + jinwei;    benwei = tmp % 10;    jinwei = tmp / 10;    res = to_string(benwei) + res ;   }   if (jinwei)    res = to_string(jinwei) + res;   return res;
}
//只考虑大数减小数情况
string sub(string s1, string s2)
{
    string res;   int tmp, benwei, jiewei = 0;   for (int i = s1.size()-1; i > 0; i--){   if (mm[s1[i]] > mm[s2[i]]){    tmp = mm[s1[i]] - mm[s2[i]] - jiewei;     jiewei = 0;   }   else if (mm[s1[i]] < mm[s2[i]]){     tmp = (mm[s1[i]] + 10) - mm[s2[i]] - jiewei;     jiewei = 1;//又借了一位   }   else if (mm[s1[i]] = mm[s2[i]]){     if (jiewei)      tmp = 9;//相当于又借了一位     else       tmp = 0;   }   res = to_string(tmp) + res;  }  return res;
}
int main()
{
    string str1, str2;     while (cin >> str1 >> str2){         int len = 0;         string ts;         //两个操作数都是负数         if ((str1[0] == '-') && (str2[0] == '-')){             if (str1.size() != str2.size()){                 while (str1.size() > str2.size())                     str2.insert(1, 1, '0');                 while (str2.size() > str1.size())                     str1.insert(1, 1, '0');             }             ts = add(str1.substr(1), str2.substr(1));             ts = '-' + ts;//加上符号         }         //第一个操作数为负,第二个为正         else if ((str1[0] == '-') && (isdigit(str2[0]))){             int flag = 0;             if (str1.size() - 1 == str2.size()){//两数长度相等                 if (str1.substr(1) == str2)                     ts = '0';                 if (mm[str1[1]] > mm[str2[0]]){                     ts = sub(str1.substr(1), str2);                     ts = '-' + ts;                 }                 else if (mm[str1[1]] < mm[str2[0]])                     ts = sub(str2, str1.substr(1));                 else if (mm[str1[1]] == mm[str2[0]]){                     for (int i = 1; i<str2.size(); i++){                         if (mm[str1[i + 1]] > mm[str2[i]]){                             flag = 1;                             break;                         }                         else if (mm[str1[i + 1]] < mm[str2[i]]){                             flag = 2;                              break;                         }                     }                     switch (flag){                     case 0:break;                     case 1:                         ts = sub(str1.substr(1), str2);                         ts = '-' + ts;                         flag = 0;                     case 2:                         ts = sub(str2, str1.substr(1));                         flag = 0;                         break;                     }                 }             }             if (str1.size() - 1 != str2.size()){//两数长度不等                 if (str1.size() - 1 > str2.size())                     flag = 1;                 else if (str1.size() - 1 < str2.size())                     flag = 2;                 while (str1.size() - 1 > str2.size())                     str2.insert(0, 1, '0');//在串头部插入‘0’                 while (str1.size() - 1 < str2.size())                     str1.insert(1, 1, '0');             }             switch (flag){             case 0:break;             case 1:                 ts = sub(str1.substr(1), str2);                 ts = '-' + ts;                 flag = 0;                 break;             case 2:                 ts = sub(str2, str1.substr(1));                 flag = 0;                 break;             }         }         //第二个操作数为负,第一个为正         else if ((isdigit(str1[0])) && (str2[0] == '-')){             int flag = 0;             if (str2.size() - 1 == str1.size()){//两数长度相等                 if (str2.substr(1) == str1)                     ts = '0';                 if (mm[str2[1]] > mm[str1[0]]){                     ts = sub(str2.substr(1), str1);                     ts = '-' + ts;                 }                 else if (mm[str2[1]] < mm[str1[0]])                     ts = sub(str1, str2.substr(1));             }             if (str1.size() - 1 != str2.size()){//两数长度不等                 if (str2.size() - 1 > str1.size())                     flag = 1;                 else if (str2.size() - 1 < str1.size())                     flag = 2;                 while (str2.size() - 1 > str1.size())                     str1.insert(0, 1, '0');//在串头部插入‘0’                 while (str2.size() - 1 < str1.size())                     str2.insert(1, 1, '0');             }             switch (flag){             case 0:break;             case 1:                 ts = sub(str2.substr(1), str1);                 ts = '-' + ts;                 flag = 0;                 break;             case 2:                 ts = sub(str1, str2.substr(1));                 flag = 0;                 break;             }         }         //两个操作数都为正         else{             if (str1.size() != str2.size()){                 while (str1.size() > str2.size())                     str2.insert(0, 1, '0');                 while (str2.size() > str1.size())                     str1.insert(0, 1, '0');             }             ts = add(str1, str2);         }         cout << ts << endl;     }     return 0;
}

编辑于 2019-07-24 15:19:30 回复(0)
import java.math.BigDecimal;
import java.util.Scanner;
public class Main
{    
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext())
        {
              String str1=sc.next();
              String str2=sc.next();
              System.out.println(new BigDecimal(str1).add(new BigDecimal(str2)));
        }
    }
}

发表于 2019-07-19 14:52:20 回复(0)
#include<iostream>
#include<string>
using namespace std;
//处理都是正的情况
string add1(string s1, string s2){
    while (s1.size() < s2.size()){
        s1 = '0' + s1;
    }//首先对齐两个字符串
    while (s2.size() < s1.size()){
        s2 = '0' + s2;
    }
    int carry = 0;//进位
    for (int i = s1.size() - 1; i >= 0; i--){
        int num = s1[i] - '0' + s2[i] - '0' + carry;
        s1[i] = num % 10 + '0';
        carry = num / 10;
    }
    if (carry) s1 = '1' + s1;
    return s1;
}
//处理s1-s2的情况,而且输入的字符串满足s1>s2;
string add2(string s1, string s2){
    while (s2.size() < s1.size()){
        s2 = '0' + s2;
    }
    int borrow = 0;
    for (int i = s1.size() - 1; i >= 0; i--){
        int num;
        if (s1[i] < s2[i]){
            num= s1[i] -borrow+ 10 - s2[i] ;
            borrow = 1;//借了一位后borrow就为1了
        }
        else{
            num = s1[i] - borrow - s2[i];
            borrow = 0;
        }
        s1[i] = num + '0';
    }
    for (int i = 0; i < s1.size(); i++){
        if (s1[i] != '0'){
            return s1.substr(i);//返回的是要去0的字符串
        }
    }
    return "0";//若字符串为全0,则返回0.
}
int main(){
    string s1;
    string s2;
    while (cin>>s1>>s2)
    {
        if (isdigit(s1[0]) && isdigit(s2[0])){//+ +
            cout << add1(s1, s2) << endl;
        }
        else if (s1[0] == '-' && s2[0] == '-'){//--
            string add_num = '-' + add1(s1.substr(1), s2.substr(1));
            cout << add_num << endl;
        }
        else if (s1[0] == '-'){//-s1+s2  - +
            //判断s1和s2的数字位的大小
            if (s1.substr(1) > s2){//s1的数字位大于s2
                string sub_num = '-' + add2(s1.substr(1), s2);
                cout << sub_num << endl;
            }
            else if (s1.substr(1) < s2){
                string sub_num = add2(s2, s1.substr(1));
                cout << sub_num << endl;
            }
            else{
                cout << "0" << endl;
            }
        }
        else{//s1-s2  + -
            if (s1 > s2.substr(1)){
                string sub_num = add2(s1, s2.substr(1));
                cout << sub_num << endl;
            }
            else if (s1 < s2.substr(1)){
                string sub_num = '-' + add2(s2.substr(1), s1);
                cout << sub_num << endl;
            }
            else{
                cout << "0" << endl;
            }
        }
    }
    return 0;
}

发表于 2019-07-18 15:30:10 回复(0)
#include <bits/stdc++.h>
 using   namespace std;
int main()
{
    string str1, str2;
    while (cin >> str1>> str2)
    {
        while(str1.size()<str2.size())
        {
            str1="0"+str1;
        }
        while(str1.size()>str2.size())
        {
            str2="0"+str2;
        }
        int num=0;
        int carry=0;
        for(int i=str1.size()-1;i>=0;i--)
        {
            num = str1[i]-'0'+str2[i]-'0'+carry;
            str1[i] = num%10+'0';
            carry = num/10;
        }
        if(carry) str1="1"+str1;
        cout<<str1<<endl;
    }
    system("pause");
    return 0;
}

发表于 2018-08-20 13:37:30 回复(0)
//只考虑了两个正整数的情况
//不过能AC
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string add(string num1, string num2);
int main() {     string str1;     string str2;     cin >> str1;     cin >> str2;     string result = add(str1, str2);     cout << result << endl;     return 0;
}

string add(string num1, string num2) {     string result;     bool flag = 0;//标识是否需要进位     reverse(num1.begin(), num1.end());     reverse(num2.begin(), num2.end());     int minsize = (num1.size() < num2.size() ? num1.size() : num2.size());     for (int i = 0; i < minsize; i++) {         if ((num1[i]-'0')+(num2[i]-'0')+flag<=9) {             result.push_back((num1[i] - '0') + (num2[i] - '0') + flag + '0');             flag = 0;         }         else {             result.push_back((num1[i] - '0') + (num2[i] - '0') + flag - 10 + '0');             flag = 1;         }     }     if (num1.size() == num2.size() && flag == 1) {         result.push_back('1');     }     else if (num1.size() < num2.size()) {         for (int i = minsize; i < num2.size(); i++) {             if (((num2[i] - '0') + flag <= 9)) {                 result.push_back((num2[i] - '0') + flag + '0');                 flag = 0;             }             else {                 result.push_back((num2[i] - '0') + flag - 10 + '0');                 flag = 1;             }         }         if (flag == 1) {             result.push_back('1');         }     }     else {         for (int i = minsize; i < num1.size(); i++) {             if (((num1[i] - '0') + flag <= 9)) {                 result.push_back((num1[i] - '0') + flag + '0');                 flag = 0;             }             else {                 result.push_back((num1[i] - '0') + flag - 10 + '0');                 flag = 1;             }         }         if (flag == 1) {             result.push_back('1');         }     }     reverse(result.begin(), result.end());     return result;
}

发表于 2018-08-15 22:43:50 回复(1)

唉,C++写这玩意儿是真挺繁琐呀~

思路:大致分为3种情况处理就ok。

  • 两个操作串都正数形式,形如a+b
  • 两个操作串都是负数形式,形如(-a)+(-b);
    此时可以去掉两串的‘-’直接复用上面情况代码
  • 两个操作串为一正一负形式,形如a+(-b);
    此时去掉‘-’模拟作减法。

注意:模拟运算时都将小且短的串 高位补0处理,这样显得没那么繁琐。


 #include <iostream>
 #include <string>
 using namespace std;

 string Add1(const string& op1, const string& op2)
 {
     string bigStr( op1);
     string smallStr( op2);
     if( op2.size( ) > op1.size( ))
         bigStr.swap(smallStr);
     int longLen = bigStr.size( );

     string res(longLen+1, '0');

     //小字符串高位补0
     smallStr.insert(0, longLen-smallStr.size( ), '0');
     int carry = 0;
     int sum  = 0;
     int index = longLen;
     for( int i=longLen-1; i>=0; --i)
     {
         int num1 = bigStr[i]-'0';
         int num2 = smallStr[i]-'0';
         //      cout<<"n1:"<<num1<<" n2:"<<num2<<endl;
         sum = num1+num2 + carry;
         carry = sum/10;
         res[index--] = (sum%10) +'0';
     }
     res[index] = carry+'0';
     //  cout<<"res:"<<res<<endl;
     int num_0  = 0;
     for( int i=0; i< longLen+1; ++i)
     {
         if(res[i] != '0')
             break;
         ++num_0;
     }
     //  cout<<"num_0: "<<num_0<<endl;
     res.erase(0, num_0) ;
     return res;
 }
 string Add2(const string& op1, const string& op2, int flag)
 {
     int len1 =op1.size( );
     int len2 =op2.size( );
     string bigStr( op1);
     string smallStr( op2);
     if( len2> len1 ||
             (len1==len2 && op2[0] > op1[0]))
         bigStr.swap(smallStr);
     //补0
     int longLen = bigStr.size( );
     smallStr.insert(0, longLen-smallStr.size( ), '0');
     string res(longLen, '0');

     int borrow= 0;
     int dif= 0;
     for( int i=longLen-1; i>= 0; --i )
     {
         int num1 = bigStr[i]-'0';
         int num2 = smallStr[i]-'0';
         dif = num1-num2-borrow;
         if( dif < 0){
             res[i] = (dif+10) +'0';
             borrow = 1;
         }
         else{
             res[i] = dif +'0';
             borrow = 0;
         }
     }
     int num_0  = 0;
     for( int i=0; i< longLen; ++i)
     {
         if(res[i] != '0')
             break;
         ++num_0;
     }
     res.erase(0, num_0);
     if(flag == -1)
         res.insert(res.begin(), '-');
     return res;
 }
 string MyAdd(const string& op1, const string& op2)
 {
     string result;

     if(op1[0] != '-' && op2[0] != '-'){ //a+b
         result = Add1(op1, op2);
     }
     else if( op1[ 0] == '-' && op2[0] == '-'){  //-a-b
         string s1( op1);
         string s2( op2);
         result =Add1(s1.erase( 0,1), s2.erase(0, 1));
         result.insert(result.begin( ), '-');
     }
     else{ //a-b
         string minusStr( op1);
         string str( op2);
         if(str[ 0] == '-')
             minusStr.swap(str);
         int flag = 1;  //获得结果正负标记

         int mLen = minusStr.size( );
         int len = str.si***usStr.erase(0, 1);
         if(mLen > len || (mLen == len && minusStr[0] > str[0]) )
             flag = -1;

         result = Add2(minusStr, str, flag);
     }
     return result;
 }

 int main( )
 {
     string str1, str2;
     while( cin>>str1>>str2)   { 
         cout<<MyAdd(str1, str2)<<endl;
    }
     return 0;
 }
编辑于 2018-07-24 10:35:33 回复(1)
import java.util.Scanner;
public class Main {
    public static String add(String d1,String d2){
        char s1='+';
        char s2='+';
        if(d1.charAt(0)=='-'){
            s1='-'; 
            d1=d1.substring(1);
            }
        if(d2.charAt(0)=='-'){
            s2='-';
            d2=d2.substring(1);
            }
        //有符号加减法
        if(d2.length()>d1.length()||(d2.length()==d1.length()&&d2.compareTo(d1)>0)){
          String dTemp=d1;
             d1=d2;
             d2=dTemp;
             char sTemp=s1;
             s1=s2;
             s2=sTemp;
        }
        if(s1==s2)
            return s1=='-'?"-"+unsignAdd(d1,d2):unsignAdd(d1,d2);
        else{
        if(d1.compareTo(d2)==0)
            return "0";
        else
            return s1=='-'?s1+sub(d1,d2):sub(d1,d2);

        }
    }
        //默认|d1|>|d2|
  public static String sub(String d1,String d2){
       d1=new StringBuilder(d1).reverse().toString();
        d2=new StringBuilder(d2).reverse().toString();
        int val=0;
        int borrow=0;
        int n1=d1.length();
        int n2=d2.length();
        StringBuilder result=new StringBuilder();
        for(int i=0;i<n1;i++){
            val=d1.charAt(i)-'0';
            if(i<n2)
            val-=d2.charAt(i)-'0';
            val-=borrow;
            if(val<0){
            val+=10;
            borrow=1;
            }
            else
            borrow=0;
            result.append(val);
        }
        //会产生0问题
        int i=0;
        for(i=result.length()-1;i>=0;i--)
            if(result.charAt(i)!=0)
                break;
        if(i==-1)
            return "0";
        return new StringBuilder(result.substring(0,i+1)).reverse().toString();
        }
/*
无符号加法(默认第一操作数大)
*/
public static String unsignAdd(String d1,String d2){
    //进行翻转
    d1=new StringBuilder(d1).reverse().toString();
    d2=new StringBuilder(d2).reverse().toString();
        int n1=d1.length();
        int n2=d2.length();
        int value=0;
        int carry=0;//代表进位
        StringBuilder result=new StringBuilder();//存放结果
        for(int i=0;i<n1;i++){
           value=d1.charAt(i)-'0';
           if(i<n2)
           value+=d2.charAt(i)-'0';
           value+=carry;
           if(value>9){
           carry=value/10;
           value=value%10;
           }
           else
           carry=0;
           result.append(value);
        }
        //如果还有进位
        if(carry==1)
            result.append('1');
        return result.reverse().toString();
        }
public static void main(String[] args) {
    Scanner s=new Scanner(System.in);
    while(s.hasNext()){
        String s1=s.next();
        String s2=s.next();
        String result=add(s1,s2);
        System.out.println(result);
    }
}
}

发表于 2018-04-03 14:02:46 回复(0)
var readline=require("readline");
var r1=readline.createInterface({
    input:process.stdin,
    output:process.stdout
});
var data=[];
r1.on('line',function(line){
    line=line.trim();
    data.push(line);
    if(data.length===2){
        var tmp=Math.max(data[0].length,data[1].length);
        var arr1=data[0].split('').reverse();
        var arr2=data[1].split("").reverse();
        var result=new Array(tmp+1);
        var sign=0;
        var temp;
        for(var i=0;i<result.length;i++){
            if(!arr1[i]){arr1[i]=0;}
            if(!arr2[i]){arr2[i]=0;}
            temp=(arr1[i]-0)+(arr2[i]-0)+sign;
            if(temp>=10){sign=1; result[i]=temp%10;}
            else{sign=0; result[i]=temp;}
        }
		if(result[tmp]==0) result.pop();
		result=result.reverse().join('');
        console.log(result);
        data=[];
    }
})
js的确可以算很大很大的数,然而结果却是科学记数法,并且进行了省略,弄了半天也没有办法禁止使用科学计数法,索性就自己写了一个,用的是数组,还是挺简单的。
发表于 2016-12-09 16:22:57 回复(0)
// 递归版大数加减法
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

// a- b
string sub(const char* left, const char* right, int borrow)
{
	if (*left == '\0' && *right == '\0')
		return (borrow == 0 ? "" : string(1, (char)(borrow + '0')));

	int result;

	if (*left == '\0')
	{
		result = -(*right - '0') - borrow;
		borrow = (result < 0 ? 1 : 0);
		result = (result < 0 ? result + 10 : result);
		return sub(left, right + 1, borrow) + (char(result + '0'));
	}
	

	if (*right == '\0')
	{
		result = (*left - '0') - borrow;
		borrow = (result < 0 ? 1 : 0);
		result = (result < 0 ? result + 10 : result);
		return sub(left + 1, right, borrow) + (char(result + '0'));
	}
	
	result = (*left - '0') - (*right - '0') - borrow;
	borrow = (result < 0 ? 1 : 0);
	result = (result < 0 ? result + 10 : result);

	return sub(left + 1, right + 1, borrow) + (char(result + '0'));
}

// a + b
string add(const char* left, const char* right, int carry)
{
	if (*left == '\0' && *right == '\0')
		return (carry == 0 ? "" : string(1, (char)(carry + '0')));

	int result;

	if (*left == '\0')
	{
		result = (*right - '0') + carry;
		carry = result / 10;
		result %= 10;
		return add(left, right + 1, carry) + (char(result + '0'));
	}
	
	
	if (*right == '\0')
	{
		result = (*left - '0') + carry;
		carry = result / 10;
		result %= 10;
		return add(left + 1, right, carry) + (char(result + '0'));
	}

	result = (*left - '0') + (*right - '0') + carry;
	carry = result / 10;
	result %= 10;
	return add(left + 1, right + 1, carry) + (char(result + '0'));
}

int main(void)
{
	string left, right;
	while (cin >> left >> right)
	{
		// 符号位判断
		bool flag_left = true, flag_right = true;
		if (left[0] == '-')
		{
			flag_left = false;
			left = left.substr(1);
		}
		if (right[0] == '-')
		{
			flag_right = false;
			right = right.substr(1);
		}
		// 去掉符号位之后长度比较,保证len(left) >= len(right)
		if (left.size() < right.size() || (left.size() == right.size() && left < right))
		{
			left.swap(right);
			flag_left ^= flag_right;
			flag_right ^= flag_left;
			flag_left ^= flag_right;
		}
		// 反转,从个位开始
		std::reverse(left.begin(), left.end());
		std::reverse(right.begin(), right.end());

		if (!flag_left)
			cout << '-';
		if (flag_left ^ flag_right) // 做减法
		{
			cout << sub(left.c_str(), right.c_str(), 0) << endl;
		}
		else // 做加法
		{
			cout << add(left.c_str(), right.c_str(), 0) << endl;
		}
	}
	
	return 0;
}

发表于 2016-09-18 13:54:33 回复(1)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
 
using namespace std;
 
int main()
{
    string A,B;
 
    while (cin>>A)
    {
        cin>>B;
 
        int A_Length=A.size();
        int B_Length=B.size();
 
        int Max_Length=0;
 
        if (A_Length>=B_Length)
        {
            Max_Length=A_Length;
        }
        else
        {
            Max_Length=B_Length;
        }
 
        //为了计算方便,将A和B补成一样长
        vector<char>A_Add;
        vector<char>B_Add;
        A_Add.clear();
        B_Add.clear();
 
        //如果A是长的那个,补B
        if ((Max_Length==A_Length)&&(Max_Length>B_Length))
        {
            for (int i=0;i<A.size();++i)
            {
                A_Add.push_back(A[i]);
            }
 
            for (int i=0;i<(B.size());++i)
            {
                B_Add.push_back(B[i]);
            }
            reverse(B_Add.begin(),B_Add.end());
            for (int i=0;i<(Max_Length-B_Length);++i)
            {
                B_Add.push_back('0');
            }
            reverse(B_Add.begin(),B_Add.end());
        }
        else
        {
            //如果B是长的那个,补A
            if (Max_Length==B_Length&&Max_Length>A_Length)
            {
                for (int i=0;i<B.size();++i)
                {
                    B_Add.push_back(B[i]);
                }
 
                for (int i=0;i<(A.size());++i)
                {
                    A_Add.push_back(A[i]);
                }
                reverse(A_Add.begin(),A_Add.end());
                for (int i=0;i<(Max_Length-A_Length);++i)
                {
                    A_Add.push_back('0');
                }
                reverse(A_Add.begin(),A_Add.end());
            }
            else
            {
                //A与B一样长,都不用补
                for (int i=0;i<A.size();++i)
                {
                    A_Add.push_back(A[i]);
                }
 
                for (int i=0;i<(B.size());++i)
                {
                    B_Add.push_back(B[i]);
                }
            }
        }
 
        //现在A和B一样长了
         
        //进位标志
        int J=0;
        vector<int>out_put_Char;
        out_put_Char.clear();
        for (int i=A_Add.size()-1;i>=0;--i)
        {
            int temp_A,temp_B;
            temp_A=A_Add[i]-'0';
            temp_B=B_Add[i]-'0';
 
            int tempC=temp_A+temp_B+J;
 
            if (tempC>=10)
            {
                tempC=tempC%10;
                J=1;
                out_put_Char.push_back(tempC);
            }
            else
            {
                J=0;
                out_put_Char.push_back(tempC);
            }
        }
        if (J==1)
        {
            out_put_Char.push_back(1);
        }
 
        for (int i=out_put_Char.size()-1;i>=0;--i)
        {
            cout<<out_put_Char[i];
        }
        cout<<endl;
    }
    return 0;
}

发表于 2016-08-30 00:50:31 回复(0)
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;

int numa[100000], numb[100000], numc[100000];

string add(string &a, string &b) {
    memset(numa, 0, sizeof(numa));
    memset(numb, 0, sizeof(numb));
    int cnt = 0;
    for (int i = (int)a.size() - 1; i >= 0; i--) {
        numa[cnt++] = a[i] - '0';
    }
    cnt = 0;
    for (int i = (int)b.size() - 1; i >= 0; i--) {
        numb[cnt++] = b[i] - '0';
    }
    
    int maxlen = max(a.size(), b.size()) + 1;
    
    int add = 0;
    for (int i = 0; i < maxlen; i++) {
        int res = numa[i] + numb[i] + add;
        numc[i] = res % 10;
        add = res / 10;
    }
    
    string ans = "";
    int pos = maxlen - 1;
    while (pos >= 0 && numc[pos] == 0) {
        pos--;
    }
    
    while (pos >= 0) {
        ans += numc[pos] + '0';
        pos--;
    }
    return ans == "" ? "0" : ans;
}

string sub(string a, string b) { // a>=
    memset(numa, 0, sizeof(numa));
    memset(numb, 0, sizeof(numb));
    int cnt = 0;
    for (int i = (int)a.size() - 1; i >= 0; i--) {
        numa[cnt++] = a[i] - '0';
    }
    cnt = 0;
    for (int i = (int)b.size() - 1; i >= 0; i--) {
        numb[cnt++] = b[i] - '0';
    }
    
    int maxlen = max(a.size(), b.size());
    
    for (int i = 0; i < maxlen; i++) {
        int res = numa[i] - numb[i];
        if (res < 0) {
            numa[i + 1]--;
            res += 10;
        }
        numc[i] = res;
    }
    
    string ans = "";
    int pos = maxlen - 1;
    while (pos >= 0 && numc[pos] == 0) {
        pos--;
    }
    
    while (pos >= 0) {
        ans += numc[pos] + '0';
        pos--;
    }
    return ans == "" ? "0" : ans;
}

bool geq(string a, string b) {
    if (a.size() != b.size()) return a.size() > b.size();
    return a >= b;
}

int main() {
    string a, b, c;
    while (cin >> a >> b) {
        bool neg1 = false, neg2 = false;
        if (a[0] == '-') {
            neg1 = true;
            a = a.substr(1, (int)a.size() - 1);
        }
        if (b[0] == '-') {
            neg2 = true;
            b = b.substr(1, (int)b.size() - 1);
        }
        
        if (neg1 == neg2) {
            c = add(a, b);
            if (neg1) {
                printf("-");
            }
            cout << c << endl;
        } else {
            if (neg1) {
                swap(a, b);
            }
            if (geq(a, b)) {
                c = sub(a, b);
            } else {
                c = sub(b, a);
                printf("-");
            }
            cout << c << endl;
        }
    }
    return 0;
}

发表于 2016-06-15 17:32:16 回复(1)