运行时间: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());
}
}
//分享一个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;
} // 运行时间: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;
} 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));
}
}
} //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;
}
} 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();
}
} #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;
}
#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;
}
//只考虑了两个正整数的情况
//不过能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;
}
唉,C++写这玩意儿是真挺繁琐呀~
思路:大致分为3种情况处理就ok。
注意:模拟运算时都将小且短的串 高位补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;
}
public class Main { public static String add(String d1,String d2){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的确可以算很大很大的数,然而结果却是科学记数法,并且进行了省略,弄了半天也没有办法禁止使用科学计数法,索性就自己写了一个,用的是数组,还是挺简单的。
// 递归版大数加减法
#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;
}
#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;
}
#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;
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <cctype>
#include <vector>
#include <stack>
using namespace std;
string add(string a, string b)
{ if(a.size()>=b.size()) b = string(a.size()-b.size(),'0')+b; else a = string(b.size()-a.size(),'0')+a; int c=0; string r; for(int i=a.size()-1;i>=0;i--) { int s=a[i]-'0'+b[i]-'0'+c; c = s/10; r = char('0'+s%10) + r; } if(c) r = '1'+r; return r;
}
string sub(string a, string b)
{ if(a.size()!=b.size()) b = string(a.size()-b.size(),'0')+b; int c=0; string r; for(int i=a.size()-1;i>=0;i--) { if(a[i]-1>=b[i]) { int s=(a[i]-c-b[i]); r = char('0'+s)+r; }else{ int s=(a[i]+10-c-b[i]); r = char('0'+s)+r; c = 1; } } return r;
}
int main()
{ string a,b; while(cin>>a>>b) { string s; if(a[0]!='-' && b[0]!='-') s = add(a,b); else if(a[0]=='-' && b[0]=='-'){ a = a.substr(1); b = b.substr(1); s = '-'+add(a,b); }else if(a[0]!='-' && b[0]=='-'){ b = b.substr(1); if(a>=b) s = sub(a,b); else s = '-'+sub(b,a); }else{ a = a.substr(1); if(a<=b) s = sub(b,a); else s = '-'+sub(a,b); } cout<<s<<endl; } return 0;
} import java.math.BigInteger;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
String a=in.next();
String b=in.next();
BigInteger c=new BigInteger(a);
BigInteger d=new BigInteger(b);
System.out.println(c.add(d));
}
}
}
#include <iostream>
#include <algorithm>
#include <sstream>
using namespace std;
int strComp(string &s1, string &s2)//返回0,表示len1>len2
{
int len1 = s1.length();
int len2 = s2.length();
if (len1>len2)
return 0;
else if (len1<len2)
return 1;
else
{
if (s1 >= s2)
return 0;
else
return 1;
}
}
string itos(long long tmp)
{
stringstream ss;
ss << tmp;
string s1 = ss.str();
return s1;
}
string add1(string numStr1, string numStr2) //两个都是正
{
string res;
int c = 0, temp;
if (numStr1.size() != numStr2.size())
{ //长度不同先补零
while (numStr1.size() < numStr2.size())
{
numStr1.insert(0, 1, '0');
}
while (numStr1.size() > numStr2.size())
{
numStr2.insert(0, 1, '0'); //在0下标元素前面插一个0
}
}
for (int i = numStr1.size() - 1; i >= 0; i--)
{ //按位相加,从低位开始
temp = (numStr1[i] - '0') + (numStr2[i] - '0') + c;
if (temp>9)
{
temp = temp % 10;
c = 1;
}
else
c = 0;
res += itos(temp);
}
if (c == 1) res += '1';//最高位还有进位,则补1个'1'
reverse(res.begin(), res.end());//逆置字符串后结果就是相加后的值(res是从低位往里添加字符的)
return res;
}
string add2(string numStr1, string numStr2) //两个都是负
{
string res;
int c = 0, temp;
if (numStr1.size() != numStr2.size())
{ //长度不同先补零
while (numStr1.size() < numStr2.size())
{
numStr1.insert(1, 1, '0');
}
while (numStr1.size() > numStr2.size())
{
numStr2.insert(1, 1, '0'); //在1下标元素前面插一个0
}
}
for (int i = numStr1.size() - 1; i>0; i--)
{ //最高位不管
temp = (numStr1[i] - '0') + (numStr2[i] - '0') + c;
if (temp>9)
{
temp = temp % 10;
c = 1;
}
else
c = 0;
res += itos(temp);
}
if (c)res += '1';//最高位
res += '-'; //添加'-'
reverse(res.begin(), res.end());
return res;
}
string add3(string numStr1, string numStr2) //一正一负
{
string res;
int flag = 0;
int c = 0, temp;
string a, b;//a-b a是被减数 b是减数 带负号的给减数
if (numStr1[0] == '-') { b = numStr1; a = numStr2; }
else{ b = numStr2; a = numStr1; }
b = b.substr(1);
if (a.size() != b.size())
{ //长度不同先补零
while (a.size() < b.size())
{
a.insert(0, 1, '0');
}
while (a.size() > b.size())
{
b.insert(0, 1, '0'); //在0下标元素前面插一个0
}
}
if (strComp(a, b) == 1)
{
string t = b;
b = a;
a = t;
flag = 1;
}
for (int i = a.size() - 1; i>=0; i--)
{ //最高位不管
temp = (a[i] - '0')-(b[i] - '0')-c;
if (temp<0)
{
temp =temp+10;
c = 1;
}
else
c = 0;
res += itos(temp);
}
if(flag==1)res += '-'; //添加'-'
reverse(res.begin(), res.end());
return res;
}
int main()
{
string numStr1, numStr2;
while (cin >> numStr1 >> numStr2)
{
string result;
if (numStr1[0] != '-'&&numStr2[0] != '-') result = add1(numStr1, numStr2);
else if (numStr1[0] == '-'&&numStr2[0] == '-') result = add2(numStr1, numStr2);
else result = add3(numStr1, numStr2);
cout << result << endl;
}
system("pause");
return 0;
}