模板高精度运算

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);
}
View Code

高精度减法

技术分享图片
#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);
}
View Code

高精度乘法

高精度乘单精度

技术分享图片
#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);
}
View Code

高精度乘高精度

技术分享图片
#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);
}
View Code

高精度除法

高精度除以单精度

技术分享图片
#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);
}
View Code

高精度除以高精度

技术分享图片
#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]);
}
View Code

 

以上是关于模板高精度运算的主要内容,如果未能解决你的问题,请参考以下文章

从零开始的算法学习生活——①高精度运算

从零开始的算法学习生活——①高精度运算

模板高精度运算

高精度运算模板学习

大数运算模板(高精度)

高精度运算模板