#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 这种
//减法要设计大的数在前 小的数在后
//最后要去零
运行时间: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)); } } }