鱼C论坛

 找回密码
 立即注册
查看: 2371|回复: 0

[学习笔记] 高精度的乘法、階乘运算函数

[复制链接]
发表于 2022-6-12 10:40:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
有点时间,随便乱写代码。

一些时候想计算超大值,程序数据类型是不允许的,比如:777888999 * 777888999,最大的 double 类型也都无法做到完全保存其运算结果,所以这里必须用高精度的运算函数,将数据变成数组或字符串之类的,进行逐个位计算。

我的代码只能用来计算乘法、階乘等算式。
例子
:54! = 2.308437e+71(结果超过 71


  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>

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

  5. namespace multiplication {
  6.         string multiply(string A, string B) {
  7.                 reverse(A.begin(), A.end());
  8.                 reverse(B.begin(), B.end());
  9.                 size_t m = A.size(), n = B.size();
  10.                 string C(m + n, '0');
  11.                 for (int i, carry = i = 0; i < n; ++i, carry = 0) {
  12.                         for (int j = 0, num; j < m; ++j) {
  13.                                 num = (C[i + j] - '0') + carry + ((A[j] - '0') * (B[i] - '0'));
  14.                                 C[i + j] = (num % 10) + '0';
  15.                                 carry = num / 10;
  16.                         }
  17.                         C[i + m] += carry;
  18.                 }
  19.                 reverse(C.begin(), C.end());
  20.                 return C;
  21.         }

  22.         string multiply(int a, int b) {
  23.                 string
  24.                         A = to_string(a),
  25.                         B = to_string(b);
  26.                 return multiply(A, B);
  27.         }

  28.         string multiply(int a, string B) {
  29.                 string A = to_string(a);
  30.                 return multiply(A, B);
  31.         }
  32. }

  33. using multiplication::multiply;
  34. namespace factorial {
  35.         string f(int num) {
  36.                 string res = "1";
  37.                 for (int n = num; n > 0; --n) {
  38.                         res = multiply(n, res);
  39.                 }
  40.                 string ans;
  41.                 bool flag = false;
  42.                 for (const char& c : res) {
  43.                         if (c - '0') flag = true;
  44.                         if (flag) ans.push_back(c);
  45.                 }
  46.                 return ans;
  47.         }
  48. }

  49. using factorial::f;
  50. using std::cout, std::endl;
  51. int main(void) {
  52.         int num = 54;
  53.         cout << f(num) << endl;
  54.         return 0;
  55. }
复制代码
  1. 230843697339241380472092742683027581083278564571807941132288000000000000
复制代码

评分

参与人数 1荣誉 +3 贡献 +3 收起 理由
sfqxx + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-14 14:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表