高精度算法
int 型的数据范围为-231~231-1,long long 型的数据范围为-263~263
高精度也就是大数运算,最核心的思想是将大数利用数组来进行存储并按位运算,对于不同的运算法则,处理的操作也有区别
对于大数运算我们可以理解为大数的竖式运算,其原理来源于小学数学的竖式计算
预处理
对于大数的运算可以先利用字符数组输入获得,然后再进一步转化为整型数组
在转化为整型数组的时候需要将整个大数逆置,这样更方便我们计算以及操作
一个大数预处理的演示代码:
char s[max];
int a[max]
gets(s);//获取字符串
int ls = strlen(s);//获得字符串长度
for(int i=0;i<ls;i++) a[ls-i] = s[i]-'0';//将获得的字符数字逆序转化为整型
高精度加法
高精度加法可以使用按位运算来进行
c[i] += a[i]+b[i]; //先按位进行加法运算
c[i+1] = c[i]/10; //进位
c[i] = c[i]%10 //进位后的值
高精度加法需要注意最高位的前导可能为0,要进行删除
c的长度最大为max(a,b)或者a+1;(a,b不是等长的时候最大为max(a,b);a,b等长为a+1或者b+1)
高精度减法
按位进行运算
if(a[i]<b[i]){ //小数借位,大数可以直接跳过
a[i+1]--;//向前一位借位
a[i] = a[i]+10
}
c[i] = a[i]-b[i];
高精度乘法
对于乘法的高精度,需要确定c[i]与a[i]*b[i]的位置
根据经验,c[i+j-1]与a[i],b[j]的位置对应(不是乘法对应)
c[i+j-1] += a[i]*b[j]; //每一位作乘法
c[i+j] += c[i+j-1]/10; //乘法进位
c[i+j-1] = c[i+j-1]%10; //本位确认
乘法c最大长度为lc = la+lb,c[lc]要注意可能会出现前导为0的情况
高精度除法
高精度除以低精度
long long b,x=0;
c[i] = (x*10+a[i])/b;
x = (x*10+a[i])%b;
注意消去前导零