模板高精度运算
Posted DEVILK
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板高精度运算相关的知识,希望对你有一定的参考价值。
高精度加法
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int LEN = 200 + 1; int a[LEN], b[LEN], c[LEN]; char s1[LEN], s2[LEN]; int main() { scanf("%s%s", s1, s2); a[0] = strlen(s1), b[0] = strlen(s2); c[0] = max(a[0], b[0]) + 1; for(int i = 0; i < a[0]; i++) a[i + 1] = s1[a[0] - i - 1] - ‘0‘; for(int i = 0; i < b[0]; i++) b[i + 1] = s2[b[0] - i - 1] - ‘0‘; int x = 0; for(int i = 1; i <= c[0]; i++) { c[i] = a[i] + b[i] + x; x = c[i] / 10; c[i] %= 10; } while(c[c[0]] == 0 && c[0] > 1) c[0]--; for(int i = c[0]; i >= 1; i--) putchar(c[i] + ‘0‘); }
高精度减法
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int LEN = 200 + 1; int a[LEN], b[LEN], c[LEN]; char s1[LEN], s2[LEN]; int main() { scanf("%s%s", s1, s2); a[0] = strlen(s1), b[0] = strlen(s2); c[0] = max(a[0], b[0]) + 1; for(int i = 0; i < a[0]; i++) a[i + 1] = s1[a[0] - i - 1] - ‘0‘; for(int i = 0; i < b[0]; i++) b[i + 1] = s2[b[0] - i - 1] - ‘0‘; for(int i = 1; i <= c[0]; i++) { c[i] = a[i] - b[i]; if(c[i] < 0) { c[i] += 10; a[i + 1]--; } } while(c[c[0]] == 0 && c[0] > 1) c[0]--; for(int i = c[0]; i >= 1; i--) putchar(c[i] + ‘0‘); }
高精度乘法
高精度乘单精度
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int LEN = 200 + 1; int b, lenb, a[LEN], c[LEN << 1]; char s[LEN]; int Digit_num(int x) { int ret = 0; while(x) { x /= 10; ret++; } return ret; } int main() { scanf("%s%d", s, &b); a[0] = strlen(s), lenb = Digit_num(b); c[0] = a[0] + lenb; for(int i = 0; i < a[0]; i++) a[i + 1] = s[a[0] - i - 1] - ‘0‘; int x = 0; for(int i = 1; i <= c[0]; i++) { c[i] = a[i] * b + x; x = c[i] / 10; c[i] %= 10; } while(x) { c[c[0]++] = x % 10; x /= 10; } while(c[c[0]] == 0 && c[0] > 1) c[0]--; for(int i = c[0]; i >= 1; i--) putchar(c[i] + ‘0‘); }
高精度乘高精度
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int LEN = 200 + 1; int a[LEN], b[LEN], c[LEN << 1]; char s1[LEN], s2[LEN]; int main() { scanf("%s%s", s1, s2); a[0] = strlen(s1), b[0] = strlen(s2); c[0] = a[0] + b[0]; for(int i = 0; i < a[0]; i++) a[i + 1] = s1[a[0] - i - 1] - ‘0‘; for(int i = 0; i < b[0]; i++) b[i + 1] = s2[b[0] - i - 1] - ‘0‘; for(int i = 1; i <= a[0]; i++) { int x = 0; for(int j = 1; j <= b[0]; j++) { c[i + j - 1] += a[i] * b[j] + x; x = c[i + j - 1] / 10; c[i + j - 1] %= 10; } c[i + b[0]] = x; } while(c[c[0]] > 0) c[0]++; while(c[c[0]] == 0 && c[0] > 1) c[0]--; for(int i = c[0]; i >= 1; i--) putchar(c[i] + ‘0‘); }
高精度除法
高精度除以单精度
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int LEN = 200 + 1; int a[LEN], c[LEN], b; char s[LEN]; int main() { scanf("%s%d", s, &b); a[0] = strlen(s); for(int i = 0; i < a[0]; i++) a[i + 1] = s[i] - ‘0‘; int x = 0; for(int i = 1; i <= a[0]; i++) { x = x * 10 + a[i]; c[++c[0]] = x / b; x %= b; } int start = 1; while(c[start] == 0 && start < c[0]) start++; for(int i = start; i <= c[0]; i++) putchar(c[i] + ‘0‘); printf("\nmod: %d", x); }
高精度除以高精度
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int LEN = 100 + 1; int a[LEN], b[LEN], c[LEN], tmp[LEN]; char s1[LEN], s2[LEN]; void Sub(int a[], int b[]) { for(int i = 1; i <= a[0]; i++) { a[i] = a[i] - b[i]; if(a[i] < 0) { a[i] += 10; a[i + 1]--; } } while(a[a[0]] == 0 && a[0] > 1) a[0]--; } int Comp(int a[], int b[]) { int up = max(a[0], b[0]); for(int i = a[0] + 1; i <= up; i++) a[i] = 0; for(int i = b[0] + 1; i <= up; i++) b[i] = 0; for(int i = 0; i < up; i++) { if(a[up - i] > b[up - i]) return 1; if(a[up - i] < b[up - i]) return -1; } return 0; } void Joint(int p[], int q[], int det) { for(int i = 1; i <= p[0]; i++) q[i + det - 1] = p[i]; q[0] = p[0] + det - 1; } int main() { scanf("%s%s", s1, s2); a[0] = strlen(s1), b[0] = strlen(s2); c[0] = a[0] - b[0] + 1; for(int i = 0; i < a[0]; i++) a[i + 1] = s1[a[0] - i - 1] - ‘0‘; for(int i = 0; i < b[0]; i++) b[i + 1] = s2[b[0] - i - 1] - ‘0‘; for(int i = c[0]; i >= 1; i--) { memset(tmp, 0, sizeof(tmp)); Joint(b, tmp, i); while(Comp(a, tmp) >= 0) { Sub(a, tmp); c[i]++; } } while(c[c[0]] == 0 && c[0] > 1) c[0]--; if(c[0] < 1) c[c[0] = 1] = 0; for(int i = c[0]; i >= 1; i--) printf("%d", c[i]); }
以上是关于模板高精度运算的主要内容,如果未能解决你的问题,请参考以下文章