string 模拟大数加减乘除

it2022-05-05  125

1、相加

#include <cstdio> #include <iostream> using namespace std; string add(string s1, string s2) { //s1更长 if(s1.length() < s2.length()) { string temp = s1; s1 = s2; s2 = temp; } for(int i = s1.length() - 1, j = s2.length() - 1; i >= 0; i--, j--) { s1[i] += j >= 0 ? s2[j] - '0' : 0; if(s1[i] - '0' >= 10) { //进位 s1[i] = (s1[i] - '0') % 10 + '0'; if(i) s1[i - 1]++; //是否需要补位 else s1 = '1' + s1; } } return s1; } int main() { string a, b; while(cin >> a >> b){ cout << add(a, b) << endl; } return 0; }

2、相减

#include <iostream> #include <cstring> #include <algorithm> using namespace std; int flag = 0; string sub(string s1, string s2){ for(int i = s1.length() - 1, j = s2.length() - 1; j >= 0; i--, j--){ if(s1[i] >= s2[j]){ s1[i] = s1[i] - s2[j] + '0'; } else{ int k = i; s1[i] = s1[i] + 10 - s2[j] + '0'; while(s1[k - 1] == '0'){ //借位 s1[k - 1] = '9'; k--; } s1[k-1]--; } } while(s1[0] == '0'){ //去掉前导0 if(s1.length() == 1) break; s1.erase(0, 1); } return s1; } int main() { string a, b; while(cin >> a >> b){ flag = 0; if(a.length() < b.length()) flag = 1; else if(a.length() == b.length() && a < b) flag = 1; if(flag) cout << "-" << sub(b, a) << endl; else cout << sub(a, b) << endl; } return 0; }

3、相乘

#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> using namespace std; const int maxn = 500007; string s1, s2; int ans[maxn]; void mul(string a, string b){ for(int i = b.length() - 1; i >= 0; i--){ for(int j = a.length() - 1; j >= 0; j--){ ans[b.length() - 1 - i + a.length() - 1 - j] += (b[i] - '0') * (a[j] - '0'); } } for(int i = 0; i < a.length() + b.length() - 1; i++){ if(ans[i] >= 10){ ans[i + 1] += ans[i] / 10; ans[i] %= 10; } } return; } int main() { while(cin >> s1 >> s2){ if(s1 == "0" || s2 == "0"){ cout << "0" << endl; continue; } memset(ans, 0, sizeof(ans)); if(s1.length() < s2.length()){ string tmp = s1; s1 = s2; s2 = tmp; } mul(s1, s2); int flag = 0; for(int i = s1.length() + s2.length() - 1; i >= 0; i--){ if(ans[i] == 0 && flag == 0){ continue; } else{ flag = 1; cout << ans[i]; } } cout << endl; } return 0; }

4、相除

#include <iostream> using namespace std; string ans, rem; //ans为商,rem为余数 string sub(string s1, string s2) { for (int i = s1.length() - 1, j = s2.length() - 1; j >= 0; i--, j--){ if (s1[i] >= s2[j]){ s1[i] = s1[i] - s2[j] + '0'; } else{ int k = i; s1[i] = s1[i] + 10 - s2[j] + '0'; while (s1[k - 1] == '0'){ s1[k - 1] = '9'; k--; } s1[k - 1]--; } } while (s1[0] == '0'){ if (s1.length() == 1) break; s1.erase(0, 1); } return s1; } string div(string a, string b) { ans.clear(); int lena = a.length(), lenb = b.length(); for (int i = lenb; i < lena; i++){ b += '0'; } while (lena >= lenb){ int cnt = 0; while (a.length() > b.length() || (a.length() == b.length() && a >= b)){ a = sub(a, b); cnt++; } ans += (cnt + '0'); lena--; b.erase(lena, 1); } rem = a; if (ans.length() == 0) ans += '0'; else if (ans[0] == '0') ans.erase(0, 1); return ans; } int main() { string s1, s2; while (cin >> s1 >> s2){ cout << div(s1, s2) << endl << rem << endl; } return 0; }

 


最新回复(0)