C ++ gran división de enteros y la resta, división, decimales

encabezamiento

//
// Created by zhengwei.
//
#include <iostream>
#include <string>
using namespace std;

/**
 * 去除头部的0
 * @param str
 * @return
 */
string dezero(const string str);

/**
 * 加法
 * @param a
 * @param b
 * @return
 */
string add(string a, string b);

/**
 * 在前面添加0
 * @param basic_string
 * @param cnt 0的个数
 */
void prependZero(string &basic_string, unsigned long cnt);

/**
 * 整数转字符串
 * @param i
 * @return
 */
string int2string(int i);

/**
 * 减法
 * @param a
 * @param b
 * @return
 */
string subtract(string a, string b);

/**
 * 比较a,b代表的整数哪个更大
 * a>b,返回1
 * a=b,返回0
 * a<b,返回-1
 * @param a
 * @param b
 * @return
 */
int cmp(string a, string b);
/**
 * 除法
 * @param a
 * @param b
 * @param p 小数点后位数
 * @return
 */
string divide(string a, string b, int p);

archivo de origen

//
// Created by zhengwei.
//
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include "BigNumber.h"

using namespace std;

int main(int argc, const char *argv[]) {
//    string s = dezero("000234");
    string addAns = add("9999999999999999999999",
                        "1111111111111111111111");
//    addAns = add("103", "98");
//    string subAns = subtract(addAns, "1111111111111111111111");
    string subAns = subtract("89", "123");
//    string dvdAns = divide("10", "2", 0);
    string dvdAns = divide("1", "3", 10);
    cout << dvdAns << endl;
    return 0;
}

string divide(string a, string b, int p) {
    string ans;
    int inte = 0;
    while (cmp(a, b) >= 0) {
        a = subtract(a, b);
        inte++;
    }
    ans.append(int2string(inte));
    if (p <= 0) {
        return ans;
    }
    ans.append(".");
    //    此时a已经小于b
    int p1 = 0;

    while (p1 < p) {
        int zeroCnt = 0;
        while (cmp(a, b) == -1) {
            a = a + "0";//后面拼一个0,代表乘以10
            zeroCnt++;
            if (zeroCnt > 1) {
                ans.append("0");
                p1++;
                if (p1 == p) {
                    return ans;
                }
            }
        }

        int t = 0;
        while (cmp(a, b) >= 0) {
            a = subtract(a, b);
            t++;
        }
        ans.append(int2string(t));
        p1++;
    }
    return ans;
}

string subtract(string a, string b) {
    string ans;
    bool negetive = false;
    unsigned long lenA = a.length();
    unsigned long lenB = b.length();
    unsigned long len;
    string x, y;
//    补0,定大数在前等准备工作
    if (lenA > lenB) {
        len = lenA;
        prependZero(b, lenA - lenB);
        x = a;
        y = b;
    } else if (lenA < lenB) {
        len = lenB;
        prependZero(a, lenB - lenA);
        x = b;
        y = a;
        negetive = true;
    } else {
        len = lenA;
        if (cmp(a, b) > 0) {
            x = a;
            y = b;
        } else if (cmp(a, b) < 0) {
            x = b;
            y = a;
            negetive = true;
        } else {
            return "0";
        }
    }
//    开始做减法
    int jie = 0;
    for (int i = len - 1; i >= 0; --i) {
        int sub = (x[i] - '0') - jie - (y[i] - '0');//按位减法
        if (sub < 0) {
            jie = 1;
            ans.insert(0, int2string(sub + 10));
        } else {
            jie = 0;
            ans.insert(0, int2string(sub));
        }
    }
    ans = dezero(ans);
    if (negetive) {
        ans.insert(0, "-");
    }
    return ans;
}

int cmp(string a, string b) {
    a = dezero(a);
    b = dezero(b);
    if (a.length() > b.length()) {
        return 1;
    }
    if (a.length() < b.length()) {
        return -1;
    }
    int i = 0, j = 0;
    while (i != a.length() && j != b.length()) {
        if (a[i] > b[j]) {
            return 1;
        } else if (a[i] < b[j]) {
            return -1;
        } else {
            i++;
            j++;
        }
    }
    return 0;
}

string add(string a, string b) {
    string ans;
    unsigned long lenA = a.length();
    unsigned long lenB = b.length();
    unsigned long len;
    if (lenA > lenB) {
        len = lenA;
        prependZero(b, lenA - lenB);
    } else if (lenA < lenB) {
        len = lenB;
        prependZero(b, lenB - lenA);
    } else {
        len = lenA;
    }
    int jin = 0;
    for (int i = len - 1; i >= 0; --i) {
        int sum = (a[i] - '0') + (b[i] - '0') + jin;
        if (sum >= 10) {
            ans.insert(0, int2string(sum - 10));
            jin = 1;
        } else {
            ans.insert(0, int2string(sum));
            jin = 0;
        }
    }
    if (jin == 1) {
        ans.insert(0, "1");
    }
    return ans;

}

string int2string(int i) {
    stringstream ss;
    ss << i;
    string ans;
    ss >> ans;
    return ans;
}

void prependZero(string &basic_string, unsigned long cnt) {
    for (int i = 0; i < cnt; ++i) {
        basic_string.insert(basic_string.begin(), '0');
    }
}

string dezero(const string str) {
    long cnt = 0;
    for (int i = 0; i < str.length(); ++i) {
        if (str[i] == '0') {
            cnt++;
        } else {
            break;
        }
    }
    if (cnt == str.length()) {
        return "0";
    } else {
        return str.substr(cnt);
    }

}
Publicados 127 artículos originales · ganado elogios 96 · vistas 310 000 +

Supongo que te gusta

Origin blog.csdn.net/zhengwei223/article/details/86670979
Recomendado
Clasificación