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函数(省略)