2022.2.26# 高精度四则运算
大数的类:
class big_num { public: int s[maxn+10] = { 0 };//采用int数组 inline void clear(); inline void read(); inline void display(); inline big_num add(big_num a1); inline big_num sub(big_num a1); inline big_num low_mul(int a1); inline big_num big_mul(big_num a1); inline big_num* div(big_num a1); };
基准操作:
inline void big_num::clear() { for (int i = 0;i <= maxn;i++) s[i] = 0; } inline void big_num::read() { char read_char[maxn]; scanf_s("%s", read_char,maxn); int len = strlen(read_char); clear(); for (int i = len - 1;i >= 0;i--) s[len-1-i] = read_char[i]-'0'; } inline void big_num::display() { int i = maxn - 1; while (s[i] == 0) i--; for (int j = i;j >= 1;j--) printf("%d", s[j]);//此处为预防输出0的场景 printf("%d\n", s[0]); }
加减同理可得:
inline big_num big_num::add(big_num a1) { big_num res; for (int i = 0;i < maxn;i++) { res.s[i] += s[i] + a1.s[i]; if (res.s[i] >= 10) { res.s[i + 1] += 1; res.s[i] -= 10; } } return res; } inline big_num big_num::sub(big_num a1) { big_num res; for (int i = 0;i < maxn;i++) { res.s[i] += s[i] - a1.s[i]; if (res.s[i] < 0) { res.s[i + 1] -= 1; res.s[i] += 10; } } return res; }
乘法分为低精度和高精度:
inline big_num big_num::low_mul(int a1) { big_num res; for (int i = 0;i < maxn;i++) { res.s[i] += s[i] * a1; if (res.s[i] >= 10) { res.s[i + 1] += res.s[i] / 10; res.s[i] = res.s[i] % 10; } } return res; } inline big_num big_num::big_mul(big_num a1) { big_num res; for (int i = 0;i < maxn;i++) { for (int j = 0;j <= i;j++) res.s[i] += s[j] * a1.s[i - j]; if (res.s[i] >= 10) { res.s[i + 1] += res.s[i] / 10; res.s[i] = res.s[i] % 10; } } return res; }
除法比较困难:
inline bool panduan(big_num a,big_num b,int i,int lenb) { if (a.s[i + lenb] > 0) return true; for (int j = lenb;j >= 0;j--) { if (a.s[j+i] > b.s[j]) return true; if (a.s[j+i] < b.s[j]) return false; } return true; } inline big_num* big_num::div(big_num a1) { big_num res[2]; big_num beichu_yushu, shang; int len1=maxn-1, len_a1=maxn-1,len_cha; while (s[len1] == 0) len1--; while (a1.s[len_a1] == 0) len_a1--; len1++; len_a1++; if (len_a1 == 0) { cout << "a1 mustn't 0"<<endl; return res; } len_cha = len1 - len_a1; for (int i = 0;i <= len1;i++) beichu_yushu.s[i] = s[i]; for (int i = len_cha;i >= 0;i--) { while (panduan(beichu_yushu, a1, i, len_a1)) { for (int j = 0;j < len_a1;j++) { beichu_yushu.s[j+i] -= a1.s[j]; if (beichu_yushu.s[j+i] < 0) { beichu_yushu.s[i+j + 1] -= 1; beichu_yushu.s[i+j] += 10; } } shang.s[i]++; } } res[0] = shang; res[1] = beichu_yushu; return res; }

浙公网安备 33010602011771号