虽然这玩意就是在考代码量qwq,但老是考还是要整理总结下。
一,什么是高精度
我们知道Int,longlong等都有一个最大精度,比如int 2147483647,有时我们需要计算的整形数字大小超过了longlong的精度,
所以我们就要用高精度进行计算。
二,高精度数的存储
通常我们用数组存储高精度数的每一位。
一般a[0]存储的是这个高精度数的位数。
a[1]存储的是这个这个高精度数的个位。
a[a[0]]存储的是这个高精度数的最高位。
读入方法:
inline void init(int a[]) { char s[10005]; cin>>s; a[0]=strlen(s); for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; return; }
三,高精度加法
高精度计算的精髓在于模拟数学中的竖式,高精度加法模拟的就是竖式的加法运算。
我们设要计算的两个数组分别为a和b,结果存到数组c中。
加法就需要进位,如果某一位c[i]=a[i]+b[i]>=10了,那么c[i+1]++;c[i]-=10;
注意高精度计算常常要处理前导零。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int numa[1005],numb[1005],ans[1005]; 9 10 inline void init(int a[]) 11 { 12 char s[1005]; 13 scanf("%s",s); 14 a[0]=strlen(s); 15 for(int i=1;i<=a[0];i++) 16 a[i]=s[a[0]-i]-'0'; 17 return; 18 } 19 20 int main() 21 { 22 init(numa); 23 init(numb); 24 int len=max(numa[0],numb[0]); 25 for(int i=1;i<=len;i++) 26 { 27 ans[i]+=numa[i]+numb[i]; 28 ans[0]++; 29 if(ans[i]>=10) 30 { 31 if(i==len) ans[0]++; 32 ans[i+1]++; 33 ans[i]-=10; 34 } 35 } 36 while(ans[0]>1&&ans[ans[0]]==0) ans[0]--; 37 for(int i=ans[0];i>=1;i--) 38 printf("%d",ans[i]); 39 return 0; 40 }
四,高精度减法
类似于高精度加法,借助了竖式运算,注意高精度减法中,被减数一定要比减数大,所以要先判断哪个比较大。
和高精度加法完全相同的输入,计算时 如果a[i]<b[i],就借一位,a[i+1]- -;a[i]+=10;
注意处理前导零。
高精度减法
五,高精度乘法
乘法 ans[i+j-1]+=numa[i]*num[j];不理解可以写一下竖式。
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int numa[50001],numb[50001],ans[50001]; inline void init(int a[]) { char s[2005]; scanf("%s",s); a[0]=strlen(s); for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; return; } int main() { init(numa); init(numb); for(int i=1;i<=numa[0];i++) for(int j=1;j<=numb[0];j++) ans[i+j-1]+=numa[i]*numb[j]; int len=numa[0]+numb[0]; for(int i=1;i<=len;i++) if(ans[i]>=10) { ans[i+1]+=ans[i]/10; ans[i]%=10; } while(len>1&&ans[len]==0) len--; for(int i=len;i>=1;i--) printf("%d",ans[i]); return 0; }
六,高精度除以低精度(整除)
模仿竖式一位一位进行除法
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; int numa[2333],numb,x,ans[2333]; inline void init(int a[]) { char s[2333]; scanf("%s",s); a[0]=strlen(s); for(int i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0'; return; } int main() { init(numa); scanf("%d",&numb); for(int i=numa[0];i>=1;i--) { ans[i]=(x*10+numa[i])/numb; x=(x*10+numa[i])%numb; } ans[0]=numa[0]; while(ans[0]>1&&ans[ans[0]]==0) ans[0]--; for(int i=ans[0];i>=1;i--) printf("%d",ans[i]); return 0; }