7 solutions
-
2
#include <iostream> using namespace std; string a, b; int main() { cin >> a >> b; int l1 = a.length(), l2 = b.length(), l = abs(l1 - l2); if (l1 > l2) while (l--) b = "0" + b; if (l1 < l2) while (l--) a = "0" + a; int temp = 0; l = max(l1, l2); while (l--) { int x = (a[l] - '0') + (b[l] - '0') + temp; if (x >= 10)temp = 1, x -= 10; else temp = 0; a[l] = x + '0'; } if (temp) a = "1" + a; cout << a << endl; return 0; }
-
1
个人觉得此解法较为易懂。
#include<bits/stdc++.h> using namespace std; string add_string(string s1, string s2){ vector<int> A,B,C; for(int i=s1.size()-1;i>=0;i--){ A.push_back(s1[i]); } for(int i=s2.size()-1;i>=0;i--){ B.push_back(s2[i]); } if(A.size()<B.size()) return add_string(s2,s1); int t=0; //本位和,包含上一次的进位 for(int i=0;i<A.size();i++){ t += A[i]-'0'; if(i<B.size()) t += B[i]-'0'; C.push_back(t%10); //本位放进来 t /= 10; //这个时候t就变成了进位 } if(t) C.push_back(t); //如果最后还有进位,要放进来 string ans; for(int i=C.size()-1;i>=0;i--){ ans += to_string(C[i]); } return ans; } int main(){ string a,b; cin>>a>>b; cout<<add_string(a,b); return 0; }
-
1
兄弟 ~ 其实 对于 c++ 的 string 来说,写一个 字符串的 大整数加法 真的不繁琐。
string add(string a,string b) { string ret; int len = a.size() > b.size() ? a.size() : b.size(); int jin = 0;// 进位 while (a.size() != len) { a = "0" + a; } while (b.size() != len) { b = "0" + b; } for (int i = len - 1; i >= 0; --i) { char c = a[i] + b[i] - '0' + jin; if (c > '9') { jin = 1; c = c - 10;// 因为最多 其实也 超不过 20 } else { jin = 0; } ret = c + ret; } if (jin == 1) { ret = "1" + ret; } return ret; }
-
1
字符串做大整数加法太繁琐了,应该使用字符串读入,将字符串或字符数组转换成int行再进行运算。
#include <stdio.h> #include <algorithm> #include <math.h> #include <vector> #include <iostream> #include <string.h> using namespace std; char a[505],b[505]; int s[600]; int main() { scanf("%s%s",&a,&b); int tmp=strlen(a),tx=strlen(b); int r=max(tmp,tx)+1; reverse(a,a+tmp); reverse(b,b+tx); int k=0; while(r--) { int x=0,y=0; if(a[k]>='0'&&a[k]<='9') x=a[k]-'0'; if(b[k]>='0'&&b[k]<='9') y=b[k]-'0'; s[k]=s[k]+x+y; if(s[k]>=10) { s[k+1]=s[k]/10; s[k]=s[k]%10; } k++; } int p=0; for(int i=k; i>=0; i--) { if(!p) { if(!s[i]); else { p=1; cout<<s[i]; } } else cout<<s[i]; } return 0; }
-
1
#include<stdio.h> #include<string.h> //因为是大数相加,本题a,b共有500位即使是long long类型也无法存放 //因为long long类型占8个字节只有64位,所以只能用字符串数组存放 char str[10100],str1[10100];//存放大数 int a[10100],b[10100];//进行相加 void add(){ int len; int str_len = strlen(str);//计算字符串长度 int str1_len = strlen(str1);//计算字符串长度 if(str_len > str1_len){//取两者中较大的一个 len = str_len; } else{ len = str1_len; } //将a和b数组清零 memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i = str_len-1; i>=0; --i){ a[str_len-1-i] = str[i]-'0'; } for(int i = str1_len-1; i>=0; --i){ b[str1_len-1-i] = str1[i]-'0'; } //将整形数据一位一位相加 for(int i = 0; i<len; i++){ a[i] = a[i] + b[i]; a[i+1] += a[i]/10; a[i] = a[i]%10; } if(a[len] != 0)//如果进位超过了本身长度则一定要len++ len++; while(a[len-1] == 0 && len>1) len--;//去掉首位为0的情况 for(int i=len-1; i>=0; --i){ printf("%d",a[i]); } printf("\n"); } int main(){ scanf("%s%s",str,str1); add(); return 0; }
-
0
这是一道高精度问题,涉及高位加减法的时候,简单的相加数据会爆掉,所以我们用数组去模拟一位一位的加减法!
#include <bits/stdc++.h> //高精度 using namespace std; const int maxn = 505; int a[maxn], b[maxn], c[maxn]; int main(void) { string aa, bb; cin >> aa >> bb; if (aa.size() < bb.size()) { swap(aa, bb); } int k = aa.size() - bb.size(); for (int i = 0; i < aa.size(); i++) { if (i < k) { a[i] = aa[i] - '0'; b[i] = 0; } else { a[i] = aa[i] - '0'; b[i] = bb[i - k] - '0'; } } int res = 0; for (int i = aa.size() - 1; i >= 0; i--) { c[i] = (a[i] + b[i] + res) % 10; res = (a[i] + b[i] + res) / 10; } if (res) cout << res; for (int i = 0; i < aa.size(); i++) { cout << c[i]; } return 0; }
- 1
Information
- ID
- 66
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 8
- Tags
- # Submissions
- 767
- Accepted
- 105
- Uploaded By