zoukankan      html  css  js  c++  java
  • C++高精度整数加减乘除模板

    其中高精度乘法通过了POJ2389,其他没有测过,不过应该是没有问题的。
    其中高精度除法返回一对string,分别表示商和余数。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 100010;
    
    int a[maxn], b[maxn], res[maxn];
    
    string add(string s1, string s2) {  // under condition: s1,s2>=0
        // 初始化部分
        int n = s1.length(), m = s2.length();
        for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
        for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
        int len = max(n, m) + 1;
        for (int i = n; i < len; i ++) a[i] = 0;
        for (int i = m; i < len; i ++) b[i] = 0;
        for (int i = 0; i < len; i ++) res[i] = 0;
        // 处理部分
        for (int i = 0; i < len; i ++) {
            res[i] += a[i] + b[i];
            if (res[i] >= 10) {
                res[i+1] += res[i] / 10;
                res[i] %= 10;
            }
        }
        // 返回部分
        int i = len-1;
        while (res[i] == 0 && i > 0) i --;
        string s = "";
        for (; i >= 0; i --) {
            char c = (char) (res[i] + '0');
            s += c;
        }
        return s;
    }
    
    string sub(string s1, string s2) {  // under condition: s1>=s2>=0
        // 初始化部分
        int n = s1.length(), m = s2.length();
        for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
        for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
        int len = max(n, m);
        for (int i = n; i < len; i ++) a[i] = 0;
        for (int i = m; i < len; i ++) b[i] = 0;
        for (int i = 0; i < len; i ++) res[i] = 0;
        // 处理部分
        for (int i = 0; i < len; i ++) {
            res[i] += a[i] - b[i];
            if (res[i] < 0) {
                res[i+1] --;
                res[i] += 10;
            }
        }
        // 返回部分
        int i = len-1;
        while (res[i] == 0 && i > 0) i --;
        string s = "";
        for (; i >= 0; i --) {
            char c = (char) (res[i] + '0');
            s += c;
        }
        return s;
    }
    
    bool cmp(string s1, string s2) {    // under condition: s1,s2 >= 0
        int n = s1.length(), m = s2.length();
        int i;
        for (i = 0; i < n-1 && s1[i] == '0'; i ++);
        s1 = s1.substr(i);
        for (i = 0; i < m-1 && s2[i] == '0'; i ++);
        s2 = s2.substr(i);
        if (s1.length() != s2.length()) return s1.length() < s2.length();
        return s1 < s2;
    }
    
    string Add(string s1, string s2) {
        if (s1[0] == '-' && s2[0] == '-') {
            return "-" + add(s1.substr(1), s2.substr(1));
        }
        else if (s1[0] == '-') {
            s1 = s1.substr(1);
            if (cmp(s1, s2) == true) {
                return sub(s2, s1);
            } else {
                return "-" + sub(s1, s2);
            }
        }
        else if (s2[0] == '-') {
            s2 = s2.substr(1);
            if (cmp(s1, s2) == true) {
                return "-" + sub(s2, s1);
            } else {
                return sub(s1, s2);
            }
        }
        else {
            return add(s1, s2);
        }
    }
    
    string Sub(string s1, string s2) {
        if (s2[0] == '-') {
            s2 = s2.substr(1);
            return Add(s1, s2);
        }
        else {
            return Add(s1, "-" + s2);
        }
    }
    
    string multi(string s1, string s2) {    // under condition: s1,s2>=0
        // 初始化部分
        int n = s1.length(), m = s2.length();
        for (int i = 0; i < n; i ++) a[i] = s1[n-1-i] - '0';
        for (int i = 0; i < m; i ++) b[i] = s2[m-1-i] - '0';
        int len = n + m;
        for (int i = n; i < len; i ++) a[i] = 0;
        for (int i = m; i < len; i ++) b[i] = 0;
        for (int i = 0; i < len; i ++) res[i] = 0;
        // 处理部分
        for (int i = 0; i < n; i ++)
            for (int j = 0; j < m; j ++)
                res[i+j] += a[i] * b[j];
        for (int i = 0; i < len; i ++) {
            res[i+1] += res[i] / 10;
            res[i] %= 10;
        }
        // 返回部分
        int i = len-1;
        while (res[i] == 0 && i > 0) i --;
        string s = "";
        for (; i >= 0; i --) {
            char c = (char) (res[i] + '0');
            s += c;
        }
        return s;
    }
    
    pair<string, string> divide(string s1, string s2) { // under condition: s1>=0,s2>0
        string s = "", t = "";
        int n = s1.length(), m = s2.length();
        bool flag = false;
        for (int i = 0; i < n; i ++) {
            s += s1[i];
            int num = 0;
            while (cmp(s, s2) == false) {
                num ++;
                s = sub(s, s2);
            }
            if (num > 0) {
                flag = true;
                char c = (char)(num + '0');
                t += c;
            }
            else if (flag) {
                t += '0';
            }
        }
        if (t.length() == 0) t = "0";
        while (s[0] == '0' && s.length() > 1) s = s.substr(1);
        return make_pair(t, s);
    }
    
    string s1, s2;
    
    int main() {
        while (cin >> s1 >> s2) {
            cout << "add:	" << Add(s1, s2) << endl;
            cout << "sub:	" << Sub(s1, s2) << endl;
            cout << "multi:	" << multi(s1, s2) << endl;
            pair<string, string> divide_pair = divide(s1, s2);
            cout << "divide:	" << divide_pair.first << " ...... " << divide_pair.second << endl;
        }
        return 0;
    }
    

    测试数据:

    100 9
    add:    109
    sub:    91
    multi:  900
    divide: 11 ...... 1
    1000000 87
    add:    1000087
    sub:    999913
    multi:  87000000
    divide: 11494 ...... 22
    
  • 相关阅读:
    开源协议介绍
    Guice vs Dependency Injection By Hand
    Eclipse与MyEclipse的联系和区别
    Java Basic
    解决Windows Vista 英文版中文软件乱码
    [转]Java B/S开发模式漫谈
    什么是Groovy
    JBoss, Geronimo, Tomcat
    一个让你迅速理解Javabean的实例
    keepalive 原理讲解 salami
  • 原文地址:https://www.cnblogs.com/zifeiy/p/10808934.html
Copyright © 2011-2022 走看看