鱼C论坛

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

[技术交流] C++ 高精度数计算

[复制链接]
发表于 2020-2-11 14:11:04 | 显示全部楼层 |阅读模式

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

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

x
高精度数计算


头文件 high_pre.h:

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <cmath>

  5. using namespace std;
  6. const int digit = 10000; // 最多一万位

  7. int *input(string prompt = "")
  8. {
  9.     /* 询问用户输入高精度数 */
  10.     int *a = (int *)malloc(digit + 1), i;
  11.     string s;
  12.     cout << prompt;
  13.     getline(cin, s);
  14.     memset(a, 0, sizeof(a)); // 数组清零
  15.     a[0] = s.size();         // 位数
  16.     for (i = 1; i <= a[0]; i++)
  17.         a[i] = s[a[0] - i] - '0'; // 将字符串转为数字并倒序存储
  18.     return a;
  19. }

  20. void print(int num[], string end = "\n")
  21. {
  22.     /* 打印高精度数 */
  23.     int i = num[0];
  24.     for (; i > 0; i--)
  25.         cout << num[i];
  26.     cout << end;
  27. }

  28. int compare(int a[], int b[])
  29. {
  30.     /* 比较 a 和 b 的大小关系,若 a > b 则返回 1,a < b 则返回 -1,a == b 则返回 1 */
  31.     int i;
  32.     if (a[0] > b[0])
  33.         return 1; // a 的位数大于 b 的位数,则 a 比 b 大
  34.     if (b[0] > a[0])
  35.         return -1; // b 的位数大于 a 的位数,则 b 比 a 大
  36.     for (i = a[0]; i > 0; i--)
  37.     {
  38.         if (a[i] > b[i])
  39.             return 1;
  40.         if (a[i] < b[i])
  41.             return -1;
  42.     }
  43.     return 0; // 各位都相等则两数相等
  44. }

  45. int *add(int a[], int b[])
  46. {
  47.     /* 计算 a + b 并返回 */
  48.     int i = 1, k = a[0] > b[0] ? a[0] : b[0], *r = (int *)malloc(digit + 1); // k 是 a 和 b 中位数最大的数的位数
  49.     for (; i <= k; i++)
  50.     {
  51.         r[i + 1] = a[i + 1] + (a[i] + b[i]) / 10; // 有进位,先进位
  52.         r[i] = (a[i] + b[i]) % 10;                // 计算当前位数字
  53.     }
  54.     if (r[k + 1] > 0)
  55.         r[0] = k + 1; // 修正新的数字的位数
  56.     else
  57.         r[0] = k;
  58.     return r;
  59. }

  60. int *sub(int a[], int b[])
  61. {
  62.     /* 计算 a - b 并返回,如果 a < b 或 a == b 则返回 0 */
  63.     int flag = compare(a, b), i = a[0], *r = (int *)malloc(digit + 1); // 调用比较函数比较大小
  64.     if (flag != 1)
  65.     {
  66.         r[0] = 1;
  67.         r[1] = 0;
  68.         return r;
  69.     }
  70.     r[0] = a[0];
  71.     for (; i > 0; i--)
  72.         r[i] = a[i];
  73.     for (i = 1; i <= a[0]; i++)
  74.     {
  75.         if (a[i] < b[i])
  76.         {
  77.             // 不够减,向上借 1
  78.             r[i + 1]--;
  79.             r[i] += 10;
  80.         }
  81.         r[i] -= b[i];
  82.         if (r[i] < 0)
  83.         {
  84.             r[i + 1]--;
  85.             r[i] += 10;
  86.         }
  87.     }
  88.     while (!r[r[0]])
  89.         r[0]--; // 修正 r 的位数
  90.     return r;
  91. }

  92. int *convert(unsigned long long n)
  93. {
  94.     /* 将非负整数转化成高精度数 */
  95.     int i, dg, *r = (int *)malloc(digit + 1);
  96.     if (n < 10)
  97.         dg = 1;
  98.     else
  99.     {
  100.         i = 2;
  101.         for (;; i++)
  102.         {
  103.             if (n < pow(10, i))
  104.             {
  105.                 dg = i;
  106.                 break;
  107.             }
  108.         }
  109.     }
  110.     r[0] = dg;
  111.     for (i = 1; i <= dg; i++)
  112.         r[i] = n % int(pow(10, i)) / int(pow(10, i - 1));
  113.     return r;
  114. }

  115. int *mul(int a[], int b[])
  116. {
  117.     /* 计算 a * b */
  118.     int i, j, *r = (int *)malloc(digit + 1);
  119.     memset(r, 0, sizeof(r));
  120.     for (i = 1; i <= a[0]; i++)
  121.     {
  122.         for (j = 1; j <= b[0]; j++)
  123.         {
  124.             r[i + j - 1] = r[i + j - 1] + a[i] * b[j];
  125.             r[i + j] = r[i + j] + r[i + j - 1] / 10;
  126.             r[i + j - 1] = r[i + j - 1] % 10;
  127.         }
  128.     }
  129.     r[0] = a[0] + b[0];
  130.     if (!r[r[0]])
  131.         r[0]--;
  132.     return r;
  133. }

  134. int *div_int(int a[], int b)
  135. {
  136.     /* 计算 a / b(b 不为高精度数) */
  137.     int *r = (int *)malloc(digit + 1), k = a[0], i, d = 0;
  138.     memset(r, 0, sizeof(r));
  139.     for (i = k; i >= 0; i--)
  140.     {
  141.         d = d * 10 + a[i];
  142.         if (!d)
  143.             continue;
  144.         r[i] = d / b;
  145.         d %= b;
  146.     }
  147.     while (!r[k] && k)
  148.         k--;
  149.     r[0] = k;
  150.     return r;
  151. }
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-28 04:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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