C++高精度计算(大整数类)

Java和Pathon可以不用往下看了

C++的基本数据类型中,范围最大的数据类型不同编译器不同,但是最大的整数范围只有[-2^63—2^63-1](对应8个字节所对应的二进制数大小)。但是对于某些需要更大数据的问题来说,C++的基本数据类型就不够用了。因此大整数类应运而生。

大整数类实现的基本思路:使用数组来储存数字的每一位,然后用类似于手写“+-×÷”竖式的过程来实现大整数类的加减乘除运算。注意每一个数在数组中都是高位在后,低位在前这样便于进行运算。

代码如下:

详细的东西都在注释中写出来了

函数的接口:因为是string类型的,所以在初始化的时候为Bright(“1”),注意要加双引号。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5 const int maxn = 100;//根据要求定
 6 struct Bright {
 7     int len, a[maxn] = { 0 };//数组的初始化很重要
 8     string x;
 9     Bright(string x = "0")//初始化函数
10     {
11         len = x.length();
12         for (int i = len - 1, j = 1; i >= 0; j++, i--)
13             a[j] = x[i] - '0';
14         while (!a[len] && len > 0)//确定位数
15             len--;
16     }
17     int& operator[](int i)//重新定义[]使程序写起来更为方便,int i 中的i表示[]中的值
18     {
19         return a[i];
20     }
21     void print()//打印出值
22     {
23         for (int i = max(len, 1); i >= 1; i--)
24             cout << a[i];
25     }
26     void zhanpin(int len1)//将数组中所有的数变为一位数(展平)
27     {
28         len = len1;
29         for (int i = 1; i < len; i++)
30         {
31             a[i + 1] += a[i] / 10;
32             a[i] = a[i] % 10;
33         }
34         while (!a[len])//确定位数
35             len--;
36     }
37 };
38 
39 Bright operator+(Bright a, Bright b)//高精度+高精度
40 {
41     Bright c;
42     int len = max(a.len, b.len);
43     for (int i = 1; i <= len; i++)
44         c[i] += a[i] + b[i];//计算贡献
45     c.zhanpin(len + 1);
46     return c;
47 }
48 
49 Bright operator*(Bright a, int b)//高精度*低精度
50 {
51     Bright c;
52     for (int i = 1; i <= a.len; i++)
53         c[i] = a[i] * b;//计算贡献
54     c.zhanpin(a.len + 11);
55     return c;
56 }
57 Bright operator*(Bright a, Bright b)//高精度*高精度
58 {
59     Bright c;
60     int len = a.len + b.len;
61     for (int i = 1; i <= a.len; i++)
62         for (int j = 1; j <= b.len; j++)
63             c[i + j - 1] += a[i] * b[j];//通过竖式计算可以发现a的第i位以及b的第j位相乘是对c的第i+j-1位有贡献。
64 c.zhanpin(len); 65 return c; 66 } 67 68 69 int main() 70 { 71 string A, B; 72 cin >> A >> B; 73 Bright a(A), b(B), c; 74 c = a * b;//(a+b,a-b) 75 c.print(); 76 }

 下面附上另一种数组储存,不是string类型储存。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 100;//根据实际设置大小
struct Bright {
    int len, a[maxn];
    Bright(int x = 0)//初始化函数
    {
        memset(a, 0, sizeof(a));//这个初始化很重要,不要忘记了
        for (len = 1; x; len++)//判断结束是以x的值来判断
            a[len] = x % 10, x = x / 10;//在这里就已经倒置了
        len--;
    }
    int& operator[](int i)//重新定义[]使程序写起来更为方便,int i 中的i表示[]中的值
    {
        return a[i];
    }
    void print()//打印出值
    {
        for (int i = max(len, 1); i >= 1; i--)
            cout << a[i];
    }
    void zhanpin(int len1)//将数组中所有的数变为一位数
    {
        len = len1;
        for (int i = 1; i < len; i++)
        {
            a[i + 1] += a[i] / 10;
            a[i] = a[i] % 10;
        }
        while (!a[len])//确定位数
            len--;
    }
};

Bright operator+(Bright a, Bright b)//高精度+高精度
{
    Bright c;
    int len = max(a.len, b.len);
    for (int i = 1; i <= len; i++)
        c[i] += a[i] + b[i];//计算贡献
    c.zhanpin(len + 1);
    return c;
}

Bright operator*(Bright a, int b)//高精度*低精度
{
    Bright c;
    for (int i = 1; i <= a.len; i++)
        c[i] = a[i] * b;//计算贡献
    c.zhanpin(a.len + 11);
    return c;
}
Bright operator*(Bright a, Bright b)//高精度*高精度
{
    Bright c;
    int len = a.len + b.len;
    for (int i = 1; i < a.len; i++)
        for (int j = 1; j < b.len; j++)
            c[i + j - 1] += a[i] * b[j];
    c.zhanpin(len);
    return c;
}
//main函数(省略)

 

posted @ 2020-03-31 15:48  鲜衣  阅读(2210)  评论(0)    收藏  举报