高精度算法
1.高精度加法
字符串输入,数组存储
#include<iostream> #include<string> #include<algorithm> #include<cstring> using namespace std; int main() { string s1, s2; //用字符串输入大数 int a[505], b[505],c[505]; //用数组储存大数每一位上的数字 memset(c, 0, sizeof(c)); memset(b, 0, sizeof(b)); memset(a, 0, sizeof(a)); cin >> s1 >> s2; for (int i = 0; i < s1.size(); i++) a[i] = s1[s1.size() - i - 1] - '0'; for (int i = 0; i < s2.size(); i++) b[i] = s2[s2.size() - i - 1] - '0'; int cnt = max(s1.size(), s2.size()) ; for (int i = 0; i <=cnt; i++) //核心算法 { c[i] = a[i] + b[i]+c[i]; c[i + 1] = c[i] / 10; c[i] = c[i] % 10; } if (c[cnt] == 0L && cnt > 0) cnt--; //若最高位有进位,则不管,否则把前导0删除 for (int i = cnt ; i >= 0; i--) cout << c[i]; return 0; }
2.高精度减法
字符串输入,数组存储
需要判断正负
//高精度减法 //数量级小于10的500次方 #include<iostream> #include<string> #include<algorithm> #include<cstring> using namespace std; int main() { string s1, s2; //用字符串输入大数 int a[505], b[505], c[505]; //用数组储存大数每一位上的数字 memset(c, 0, sizeof(c)); memset(b, 0, sizeof(b)); memset(a, 0, sizeof(a)); cin >> s1 >> s2; int flag = 0; if (s1.size()<s2.size()||(s1.size()==s2.size()&&s1<s2)) //判断两个数字谁大 { //长度小的和长度相同但字典序小的 需要交换 flag = 1; string t = s1; s1 = s2; s2 = t; } for (int i = 0; i < s1.size(); i++) a[i] = s1[s1.size() - i - 1] - '0'; for (int i = 0; i < s2.size(); i++) b[i] = s2[s2.size() - i - 1] - '0'; int cnt = max(s1.size(), s2.size()); for (int i = 0; i <= cnt; i++) //核心算法 { if (a[i] < b[i]) { a[i + 1]--; a[i] += 10; } c[i] = a[i] - b[i]; } while (c[cnt] == 0 && cnt > 0) cnt--; if (flag == 1) //若是负数,直接输出负号 cout << '-'; for (int i = cnt; i >= 0; i--) cout << c[i]; return 0; }
算法入门基础 文章被收录于专栏
Dawn的算法入门