傻眼貓咪 发表于 2022-6-12 10:40:47

高精度的乘法、階乘运算函数

有点时间,随便乱写代码。{:5_93:} {:5_93:} {:5_93:}

一些时候想计算超大值,程序数据类型是不允许的,比如:777888999 * 777888999,最大的 double 类型也都无法做到完全保存其运算结果,所以这里必须用高精度的运算函数,将数据变成数组或字符串之类的,进行逐个位计算。
我的代码只能用来计算乘法、階乘等算式。
例子:54! = 2.308437e+71(结果超过 71位)

#include <iostream>
#include <string>
#include <algorithm>

using std::string, std::to_string, std::reverse;

namespace multiplication {
      string multiply(string A, string B) {
                reverse(A.begin(), A.end());
                reverse(B.begin(), B.end());
                size_t m = A.size(), n = B.size();
                string C(m + n, '0');
                for (int i, carry = i = 0; i < n; ++i, carry = 0) {
                        for (int j = 0, num; j < m; ++j) {
                              num = (C - '0') + carry + ((A - '0') * (B - '0'));
                              C = (num % 10) + '0';
                              carry = num / 10;
                        }
                        C += carry;
                }
                reverse(C.begin(), C.end());
                return C;
      }

      string multiply(int a, int b) {
                string
                        A = to_string(a),
                        B = to_string(b);
                return multiply(A, B);
      }

      string multiply(int a, string B) {
                string A = to_string(a);
                return multiply(A, B);
      }
}

using multiplication::multiply;
namespace factorial {
      string f(int num) {
                string res = "1";
                for (int n = num; n > 0; --n) {
                        res = multiply(n, res);
                }
                string ans;
                bool flag = false;
                for (const char& c : res) {
                        if (c - '0') flag = true;
                        if (flag) ans.push_back(c);
                }
                return ans;
      }
}

using factorial::f;
using std::cout, std::endl;
int main(void) {
      int num = 54;
      cout << f(num) << endl;
      return 0;
}230843697339241380472092742683027581083278564571807941132288000000000000
页: [1]
查看完整版本: 高精度的乘法、階乘运算函数