——————出自南昌理工学院ACM
高精其实理解了就很好解决,下面让我们一起来看看高精度算法的新萌小模板,如有不足还望指教。
高精加法:
这里有些学长喜欢用二维数组的去处理,新萌在这里用的是三个一位数组处理。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
int n,m,pd=0;
cin>>n>>m;
n=m-n;
int a[1200]={0},b[1200]={0},c[1200]={0};
a[1]=1;
b[1]=2;
for(int i=1;i<=n-2;i++){
for(int j=1;j<1200;j++){
c[j]=b[j]+a[j];
}
for(int j=1;j<1200;j++){
while(c[j]>9){
c[j+1]++;
c[j]-=10;
}
}
for(int j=1;j<1200;j++){
a[j]=b[j];
}
for(int k=1;k<1200;k++){
b[k]=c[k];
}
memset(c,0,sizeof(c));
}
if(n==1)cout<<1;
else if(n==0)cout<<0;
else
for(int i=1200-1;i>=1;i--){
if(!pd&&b[i]==0)continue;
cout<<b[i];pd=1;
}
return 0;
}
高精减法:
#include<iostream>
#include<cstring>
using namespace std;
char s1[10088],s2[10088];
int a[10088],b[10088],c[10088];
int main(){
int len1,len2,len3,i;
cin>>s1+1;
cin>>s2+1;
len1=strlen(s1+1);
len2=strlen(s2+1);
if(len1<len2||(len1==len2&&strcmp(s1,s2)<0)){
cout<<'-';
swap(s1,s2);
swap(len1,len2);
}
len3=max(len1,len2);
for(i=1;i<=len1;i++){
a[len1-i+1]=s1[i]-'0';
}
for(i=1;i<=len2;i++){
b[len2-i+1]=s2[i]-'0';
}
for(i=1;i<=len3;i++)
{
c[i]=c[i]+a[i]-b[i];
if(c[i]<0){
c[i]+=10;
c[i+1]--;
}
}
while(c[len3]==0)len3--;
if(len3<1)cout<<0;
else
for(i=len3;i>0;i--)
cout<<c[i];
return 0;
}
高精乘法:
高精乘(int,long long)类型
这里就没有写高精乘高精,概念差不多
#include<iostream>
#include<cstring>
using namespace std;
char s1[2001],s2[2001];
int a[2001],b[2001],c[2001],i,j,len1,len2,len3;
int main(){
cin>>s1+1;
cin>>s2+1;
len1=strlen(s1+1);
len2=strlen(s2+1);
for(i=1;i<=len1;i++)
a[len1+1-i]=s1[i]-'0';
for(i=1;i<=len2;i++)
b[len2-i+1]=s2[i]-'0';
len3=len1+len2-1;
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++){
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
while(c[len3+1]>0)len3++;
while(c[len3]==0&&len3!=1)len3--;
for(i=len3;i>0;i--)
cout<<c[i];
return 0;
}
6N+1是判断这个数是否是素数的一种较好的方法。它能够大大降低时间程序的复杂度。
int isPrime(long long num) {
if(num<=1) return 0;
if(num==2||num==3) return 1;
if(num%6!=1&&num%6!=5) return 0;
for(long long i=5; i*i<=num; i+=6)
if(num%i==0||num%(i+2)==0) return 0;
}