什么是高精度
众所周知,在C++和C里,有着各种各样的类型,且各有各的范围
类型名 取值范围
signed char -128~127
unsiged char 0~255
short int -32768~32767
int -2147483648~2147483647
unsigned int 0~4294967295
long -2147483648~2141483647
unsigned long 0~4294967295
long long -9223372036854775808~9223372036854775807
unsigned long long 0~18446744073709551615
虽然longlong能表示出的数已经非常的大了,但是在某些时候,它依旧不够用
比如说,你要计算685111232的15次方,longlong就表示不出来,并且还会还给你一个内存溢出
,为了节约空间,同时让我们能够算出这些大数据,我们需要一种应用数组进行模拟计算的方法——高精度计算。
高精度数的读写
1.读入高精度数
直观地输入一个高精度数时,我们需要存储一个有很多很多位的数字.
如何存储?最直接的方法就是将它存入一个字符串.
例如,我们可以这样:
#include<bits/stdc++.h>
using namespace std;
int main(){
string a;
getline(cin,a);
}
2. 存储高精度数
现在,数据的读取完成了,我们应该如何处理这个数,让他变得方便于计算呢?
我们不妨再设置一个数组,然后将输入的数逆序存入,也就是将str的最后一位存入数组a的第0位、将str的倒数第二位存入数组a的第1位……这个时候就有人会问了:为什么要逆序存储?
这是因为,数据的长度毕竟不确定,高精度计算既然是利用数组计算,应当是需要每一位每一位对齐再处理运算. 如果顺序存储,两个数长度不一样,最后一位的下标也不同,最后处理运算时最后一位不能直接对齐,还要经过一个移位的操作,显然加大了计算机的操作量. 反之,如果我们采取逆序存储的方式,存入的数组从第0位开始依次是个位、十位、百位……这些对应关系不会随着数据的长度改变而改变,有利于后面对两个高精度数进行运算.
#include <string.h>
int a[100] = {0};//100应该为这个数据可能的最大位数.
for(int i = 0; i < strlen(str); ++i)
a[i] = str[strlen(str) - i - 1] - '0';