高精度运算

题单介绍

[代码](https://www.luogu.com.cn/paste/qn5bpvub) 由于在c++中,整数的最大类型为unsigned long long类型。它最大能表示$2^{64}-1$。但是有些时候,我们需要计算更大的整数,那ull就没法计算了。 之前我们学到怎么把一个十进制数一位一位分离。那能不能分离之后每一个变量存一位数,用一个数组来表示一个大整数呢。 很显然是可以的。但是随之而来的又是一个新的问题:c++帮我们实现了int类型和longlong类型的四则运算,但是它却不会两个数组之间的四则运算。那么两个大整数需要四则运算的时候该怎么办呢? 那只能我们自己动手去实现了。 我们用一个数组a来记录一个大整数。其中a[0]表示位数,a[1]表示个位,a[2]表示十位,……。以此类推。 ``` 大整数的读入:由于整数太长,所以不可能用int类型读。所以必须用字符串读完后再转移到大整数数组里 char s[100]; int a[100]; scanf("%s",s); int len=strlen(s); for(int i=0;i<len;i++)a[len-i]=s[i]-'0'; a[0]=len; 大整数的输出: for(int i=a[0];i>=1;i--)printf("%d",a[i]); 大整数的加法:按位加完后再进位,最后判断是否有多一位 int c[100];//a与b的和存到c里面 int len=max(a[0],b[0]); for(int i=1;i<=len;i++)c[i]=a[i]+b[i]; for(int i=1;i<=len;i++) if(c[i]>=10){ c[i+1]++; c[i]-=10; } } if(c[len+1]>0)len++; c[0]=len; 大整数的减法:减完后再借位,最后去掉前导零,至少留1位 int c[100];//a与b的和存到c里面 int len=max(a[0],b[0]); for(int i=1;i<=len;i++)c[i]=a[i]-b[i]; for(int i=1;i<=len;i++) if(c[i]<0){ c[i+1]--; c[i]+=10; } } while(len>1&&c[len]==0)len--; c[0]=len; 大整数的乘法: int c[200];//记得长度开两倍 int c[0]=a[0]+b[0]-1; for(int i=1;i<=a[0];i++){ for(int j=1;j<=b[0];j++){ c[i+j-1]+=a[i]*b[j]; } } for(int i=1;i<=c[0];i++){ if(c[i]>=10){ c[i+1]+=c[i]/10; c[i]%=10; } } if(c[c[0]+1]>0)c[0]++; 大整数除以小整数: int c[100],rest=0; for(int i=a[0];i>=1;i--){ rest=rest*10+a[i]; c[i]=rest/b; rest%=b; } c[0]=a[0]; while(c[0]>1&&c[c[0]]==0)c[0]--; ```

题目列表

  • A+B Problem(高精)
  • 高精度减法
  • A*B Problem
  • A/B Problem
  • [NOIP 1998 普及组] 阶乘之和
  • [NOIP 2003 普及组] 麦森数