zoukankan      html  css  js  c++  java
  • 高精度模板

    A+B

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define MAXN 2000
    
    using namespace std;
    
    int a[MAXN], b[MAXN];
    char c[MAXN], d[MAXN];
    int ans[MAXN];
    int lans = 1, la, lb;
    
    void High_precision_add() {
        int x = 0;
        while(lans <= la||lans <= lb) {
            ans[lans] = a[lans]+b[lans]+x;
            x = ans[lans]/10;
            ans[lans] = ans[lans]%10;
            lans++;
        }
        ans[lans] = x;
        while(ans[lans] == 0&&lans > 1) {
            lans--;
        }
        reverse(ans+1, ans+lans+1);
        for(int i=1; i<=lans; i++) {
            printf("%d", ans[i]);
        }
        printf("
    ");
    }
    
    void read() {
        scanf("%s%s", c, d);
        la = strlen(c), lb = strlen(d);
        for(int i=0; i<la; i++) {
            a[la-i] = c[i]-'0';
        }
        for(int i=0; i<lb; i++) {
            b[lb-i] = d[i]-'0';
        }
    }
    
    int main() {
        read();
        High_precision_add();
    }

    A-B

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define MAXN 10005
    
    using namespace std;
    
    char c[MAXN], d[MAXN];
    int a[MAXN], b[MAXN];
    int ans[MAXN];
    int la, lb, lans = 1;
    
    bool cmp() {
        if(la == lb) return c[la-1] >= d[lb-1];
        return la >= lb;
    }
    
    void read() {
        scanf("%s%s", c, d);
        la = strlen(c), lb = strlen(d);
        if(!cmp()) {
            printf("-");
            swap(la, lb);
            for(int i=0; i<la; i++) {
                a[la-i] = d[i]-'0';
            }
            for(int i=0; i<lb; i++) {
                b[lb-i] = c[i]-'0';
            }
        }
        else {
            for(int i=0; i<la; i++) {
                a[la-i] = c[i]-'0';
            }
            for(int i=0; i<lb; i++) {
                b[lb-i] = d[i]-'0';
            }
        }
    }
    
    void High_precision_subtraction() {
        int x = 0;
        while(lans <= la||lans <= lb) {
            if(a[lans]-b[lans]-x < 0) {
                ans[lans] = a[lans]+10-b[lans]-x;
                x = 1;
            }
            else {
                ans[lans] = a[lans]-b[lans]-x;
                x = 0;
            }
            lans++;
        }
        while(ans[lans] == 0&&lans > 1) {
            lans--;
        }
        reverse(ans+1, ans+lans+1);
        for(int i=1; i<=lans; i++) {
            printf("%d", ans[i]);
        }
        printf("
    ");
    }
    
    int main() {
        read();
        High_precision_subtraction();
    }

    A*B

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define MAXN 10005
    
    using namespace std;
    
    int la, lb;
    char c[MAXN], d[MAXN];
    int a[MAXN], b[MAXN];
    int ans[MAXN];
    
    void read() {
        scanf("%s%s", c, d);
        la = strlen(c), lb = strlen(d);
        for(int i=0; i<la; i++) {
            a[la-i] = c[i]-'0';
        }
        for(int i=0; i<lb; i++) {
            b[lb-i] = d[i]-'0';
        }
    }
    
    void High_precision_multiplication() {
        for(int i=1; i<=la; i++) {
            int x = 0;
            for(int j=1; j<=lb; j++) {
                ans[i+j-1] += x+a[i]*b[j];
                x = ans[i+j-1]/10;
                ans[i+j-1] %= 10;
            }
            ans[i+lb] = x;
        }
        int l = la+lb;
        while(ans[l] == 0&&l > 1) {
            l--;
        }
        reverse(ans+1, ans+l+1);
        for(int i=1; i<=l; i++) {
            printf("%d", ans[i]);
        }
        printf("
    ");
    }
    
    int main() {
        read();
        High_precision_multiplication();
    }

    A/B

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define MAXN 10005
    
    using namespace std;
    
    int la, lans = 1;
    char c[MAXN];
    int a[MAXN], b;
    int ans[MAXN];
    
    void read() {
        cin>>c;
        scanf("%d", &b);
        la = strlen(c);
        for(int i=0; i<la; i++) {
            a[i+1] = c[i]-'0';
        }
    }
    
    void High_precision_division() {
        int x = 0;
        for(int i=1; i<=la; i++) {
            ans[i] = a[i]/b;
            x = a[i]%b;
            a[i+1] += x*10;
        }
        while(lans < la&&ans[lans] == 0) {
            lans++;
        }
        for(int i=lans; i<=la; i++) {
            printf("%d", ans[i]);
        }
        printf("
    ");
    }
    
    int main() {
        read();
        High_precision_division();
    }
    作者:wlz
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    HDU 1548 A strange lift (Dijkstra)
    HDU 1217 Arbitrage (Floyd)
    HDU 1385 Minimum Transport Cost (Dijstra 最短路)
    考研总结 2016-12-31 20:10 219人阅读 评论(21) 收藏
    归并排序 2016-12-30 20:17 208人阅读 评论(21) 收藏
    docker安装 2016-11-06 19:14 299人阅读 评论(31) 收藏
    Docker初步了解 2016-10-30 20:46 279人阅读 评论(31) 收藏
    [自考]感想 2016-10-23 20:28 261人阅读 评论(32) 收藏
    [自考]C++中一些特殊用法 2016-10-16 22:12 318人阅读 评论(30) 收藏
    Fitnesse批量读取变量信息,并保存到用例执行上下文中
  • 原文地址:https://www.cnblogs.com/bljfy/p/8537296.html
Copyright © 2011-2022 走看看