zltzlt 发表于 2020-2-11 14:11:04

C++ 高精度数计算

高精度数计算

头文件 high_pre.h:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>

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

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

void print(int num[], string end = "\n")
{
    /* 打印高精度数 */
    int i = num;
    for (; i > 0; i--)
      cout << num;
    cout << end;
}

int compare(int a[], int b[])
{
    /* 比较 a 和 b 的大小关系,若 a > b 则返回 1,a < b 则返回 -1,a == b 则返回 1 */
    int i;
    if (a > b)
      return 1; // a 的位数大于 b 的位数,则 a 比 b 大
    if (b > a)
      return -1; // b 的位数大于 a 的位数,则 b 比 a 大
    for (i = a; i > 0; i--)
    {
      if (a > b)
            return 1;
      if (a < b)
            return -1;
    }
    return 0; // 各位都相等则两数相等
}

int *add(int a[], int b[])
{
    /* 计算 a + b 并返回 */
    int i = 1, k = a > b ? a : b, *r = (int *)malloc(digit + 1); // k 是 a 和 b 中位数最大的数的位数
    for (; i <= k; i++)
    {
      r = a + (a + b) / 10; // 有进位,先进位
      r = (a + b) % 10;                // 计算当前位数字
    }
    if (r > 0)
      r = k + 1; // 修正新的数字的位数
    else
      r = k;
    return r;
}

int *sub(int a[], int b[])
{
    /* 计算 a - b 并返回,如果 a < b 或 a == b 则返回 0 */
    int flag = compare(a, b), i = a, *r = (int *)malloc(digit + 1); // 调用比较函数比较大小
    if (flag != 1)
    {
      r = 1;
      r = 0;
      return r;
    }
    r = a;
    for (; i > 0; i--)
      r = a;
    for (i = 1; i <= a; i++)
    {
      if (a < b)
      {
            // 不够减,向上借 1
            r--;
            r += 10;
      }
      r -= b;
      if (r < 0)
      {
            r--;
            r += 10;
      }
    }
    while (!r])
      r--; // 修正 r 的位数
    return r;
}

int *convert(unsigned long long n)
{
    /* 将非负整数转化成高精度数 */
    int i, dg, *r = (int *)malloc(digit + 1);
    if (n < 10)
      dg = 1;
    else
    {
      i = 2;
      for (;; i++)
      {
            if (n < pow(10, i))
            {
                dg = i;
                break;
            }
      }
    }
    r = dg;
    for (i = 1; i <= dg; i++)
      r = n % int(pow(10, i)) / int(pow(10, i - 1));
    return r;
}

int *mul(int a[], int b[])
{
    /* 计算 a * b */
    int i, j, *r = (int *)malloc(digit + 1);
    memset(r, 0, sizeof(r));
    for (i = 1; i <= a; i++)
    {
      for (j = 1; j <= b; j++)
      {
            r = r + a * b;
            r = r + r / 10;
            r = r % 10;
      }
    }
    r = a + b;
    if (!r])
      r--;
    return r;
}

int *div_int(int a[], int b)
{
    /* 计算 a / b(b 不为高精度数) */
    int *r = (int *)malloc(digit + 1), k = a, i, d = 0;
    memset(r, 0, sizeof(r));
    for (i = k; i >= 0; i--)
    {
      d = d * 10 + a;
      if (!d)
            continue;
      r = d / b;
      d %= b;
    }
    while (!r && k)
      k--;
    r = k;
    return r;
}
页: [1]
查看完整版本: C++ 高精度数计算