[SinGuLaRiTy] 高精度算法代码库

时间:2024-01-01 17:50:57

【SinGuLaRiTy-1001】 Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved.

加法:

#include<stdio.h>
#include<string.h>
char a[],b[];
char c[];
int i;
void swap(char a[])
{
char tmp;
for(int i=;i<strlen(a)/;i++)
{
tmp=a[i];
a[i]=a[strlen(a)--i];
a[strlen(a)--i]=tmp;
}
}
void add(char a[],char b[])
{
for(i=;i<strlen(a)&&i<strlen(b);i++)
{
c[i]+=a[i]+b[i]-'';
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(strlen(a)==strlen(b))
if(c[i]==)
c[i]='';
if(strlen(a)>strlen(b))
{
if(c[i]==)
{
for(;i<strlen(a);i++)
{
c[i]+=a[i];
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(c[i-]=='')
c[i]='';
}
else
for(;i<strlen(a);i++)
c[i]=a[i];
}
if(strlen(b)>strlen(a))
{
if(c[i]==)
{
for(;i<strlen(b);i++)
{
c[i]+=b[i];
if(c[i]-''>=)
{
c[i]=c[i]-;
c[i+]=;
}
}
if(c[i]==)
c[i]='';
}
else
for(;i<strlen(b);i++)
c[i]=b[i];
}
}
int main()
{
scanf("%s",a);
scanf("%s",b);
swap(a);
swap(b);
add(a,b);
swap(c);
printf("%s",c);
return ;
}

减法:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
char a[],b[];
int a1[],b1[];
int c[];
int i,j,al,bl,l;
int main()
{
scanf("%s",a);
scanf("%s",b);
al=strlen(a);
bl=strlen(b);
l=al>bl?al:bl;
for(i=;i<al;i++)
a1[al-i-]=a[i];
for(i=;i<bl;i++)
b1[bl-i-]=b[i];
for(i=l-;i>=;i--)
{
if(al>bl || a1[i]>b1[i])
{
for(j=;j<l;j++){
c[j]=a1[j]-b1[j]+'';
if(b1[j]==)
c[j]-='';
}
for(j=;j<l-;j++)
if(c[j]<'')
{
c[j]+=;
c[j+]--;
}
while(c[l-]==''&&l!=)
l--;
for(j=l-;j>=;j--)
printf("%c",c[j]);
break;
}
if(al<bl||a1[i]<b1[i])
{
for(j=;j<l;j++)
{
c[j]=b1[j]-a1[j]+'';
if(a1[j]==)
c[j]-='';
}
for(j=;j<l-;j++)
if(c[j]<'')
{
c[j]+=;
c[j+]--;
if(c[j+]==''&&j+==l-)
l--;
}
while(c[l-]==''&&l!=)
l--;
printf("-");
for(j=l-;j>=;j--)
printf("%c",c[j]);
break;
}
}
return ;
}

乘法:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int jw,sum,ac,bc,k;
int a,b,ans[];
string A;
string B;
int main()
{
cin>>A>>B;
ac=A.size()-;
bc=B.size()-;
for(int i=;i<=ac;i++)
{
a=A[ac-i]-'';
for(int j=;j<=bc;j++)
{
k=i+j;
b=B[bc-j]-'';
ans[k]+=a*b;
if(ans[k]>=)
{
ans[k+]+=ans[k]/;
ans[k]%=;
}
}
}
if(ans[k+]>)
k++;
for(int i=k;i>=;i--)
cout<<ans[i];
return ;
} Square 【开方】:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
int l;
int work(int o,char *O,int I)
{
char c,*D=O ;
if(o>)
{
for(l=;D[l];D[l++]-=)
{
D[l++]-=;
D[l]-=;
while(!work(,O,l))
D[l]+=;
putchar((D[l]+)/);
}
putchar();
}
else
{
c=o+(D[I]+)%-(I>l/)*(D[I-l+I]+)/-;
D[I]+=I< ? : !(o=work(c/,O,I-))*((c+)%-(D[I]+)%);
}
return o;
}
int main()
{
char s[];
s[]='';
scanf("%s",s+);
if(strlen(s)%==)
work(,s+,);
else
work(,s,);
return ;
}

整数除法:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
char s1[],s2[];
int a1[],a2[],a3[],a4[],len1,len2,len3,i,j;
int bi(int a3[],int a4[])
{
if(a3[]<a4[])
return ;
if(a3[]>a4[])
return ;
for(int i=a3[];i>;i--)
{
if(a3[i]<a4[i])
return ;
if(a3[i]>a4[i])
return ;
}
return ;
}
int jian(int a3[],int a4[])
{
for(int i=;i<=a3[];i++)
{
if(a3[i]<a4[i])
{
a3[i]+=;
a3[i+]--;
}
a3[i]-=a4[i];
}
for(;a3[a3[]]==&&a3[]>;a3[]--);
}
int main()
{
scanf("%s",s1);
scanf("%s",s2);
len1=strlen(s1);
len2=strlen(s2);
for(i=;i<len1;i++)
a1[len1-i]=s1[i]-'';
for(i=;i<len2;i++)
a2[len2-i]=s2[i]-'';
a1[]=len1;
a2[]=len2;
a4[]=a1[]-a2[]+;
for(i=a4[];i>;i--)
{
memset(a3,,sizeof(a3));
for(j=;j<=a2[];j++)
a3[j+i-]=a2[j];
a3[]=a2[]+i-;
for(;bi(a1,a3);)
{
a4[i]++;
jian(a1,a3);
}
}
for(;a4[a4[]]==&&a4[]>;a4[]--);
for(i=a4[];i>;i--)
printf("%d",a4[i]);
return ;
}

高精度非整除求余数除法:

#include<iostream>
#include<cstring>
using namespace std;
int a[],b[],c[];
int d,i;
void init(int a[])
{
string s;
cin>>s;
a[]=s.length();
for(i=;i<=a[];i++)
{
a[i]=s[a[]-i]-'';
}
}
void print(int a[])
{
int i;
if(a[]==)
{
cout<<<<endl;
return;
}
for(i=a[];i>;i--)
{
cout<<a[i];
}
cout<<endl;
return;
}
int compare(int a[],int b[])
{
int i;
if(a[]>b[])
return ;
if(a[]<b[])
return -;
for(i=a[];i>;i--)
{
if(a[i]>b[i])
return ;
if(a[i]<b[i])
return -;
}
return ;
}
void subtraction(int a[],int b[])
{
int flag,i;
flag=compare(a,b);
if(flag==)
{
a[]=;
return;
}
if(flag==)
{
for(i=;i<=a[];i++)
{
if(a[i]<b[i])
{
a[i+]--;
a[i]+=;
}
a[i]-=b[i];
}
while(a[]>&&a[a[]]==)
a[]--;
return;
}
}
void numcpy(int p[],int q[],int det)
{
for(int i=;i<=p[];i++)
{
q[i+det-]=p[i];
}
q[]=p[]+det-;
}
void Division(int a[],int b[],int c[])
{
int i,tmp[];
c[]=a[]-b[]+;
for(i=c[];i>;i--)
{
memset(tmp,,sizeof(tmp));
numcpy(b,tmp,i);
while(compare(a,tmp)>=)
{
c[i]++;
subtraction(a,tmp);
}
}
while(c[]>&&c[c[]]==)
c[]--;
return;
}
int main()
{
memset(a,,sizeof(a));
memset(b,,sizeof(a));
memset(c,,sizeof(a));
init(a);
init(b);
Division(a,b,c);
print(c);
print(a);
return ;
}

*四则高精度混合运算:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 1000
struct hp{
int a[MAXN+];
hp(){
memset(a,,sizeof a);
a[]=;
}
hp(int n){
memset(a,,sizeof a);
a[]=;
while(n){
a[++a[]]=n%;
n/=;
}
if(!a[])
a[]=;
}
hp(char *s){
memset(a,,sizeof a);
int len=strlen(s);
for(int i=;i<=len;i++)
a[i]=s[len-i]-'';
a[]=len;
}
hp operator*(const hp &b)const{
hp c;
int i,j,len=a[]+b.a[];
for(i=;i<=a[];i++)
for(j=;j<=b.a[];j++)
c.a[i+j-]+=a[i]*b.a[j];
for(i=;i<len;i++){
c.a[i+]+=c.a[i]/;
c.a[i]%=;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator/(int b)const{
hp c;
int d=,i,len=a[];
for(i=a[];i;i--){
d=d*+a[i];
c.a[i]=d/b;
d%=b;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator+(const hp &b)const{
hp c;
int len=max(a[],b.a[]),i;
for(i=;i<=len;i++){
c.a[i]+=a[i]+b.a[i];
c.a[i+]=c.a[i]/;
c.a[i]%=;
}
len++;
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
hp operator-(const hp &b)const{
hp c;
int i,len=a[];
for(i=;i<=len;i++){
c.a[i]+=a[i]-b.a[i];
if(c.a[i]<)
c.a[i]+=,c.a[i+]--;
}
while(len>&&!c.a[len])
len--;
c.a[]=len;
return c;
}
void operator*=(const hp &x){
*this=*this*x;
}
void operator/=(const int &x){
*this=*this/x;
}
void operator+=(const hp &x){
*this=*this+x;
}
void operator-=(const hp &x){
*this=*this-x;
}
void print(){
for(int i=a[];i;i--)
printf("%d",a[i]);
}
bool operator>(const hp&b)const{
if(a[]>b.a[])
return ;
if(a[]<b.a[])
return ;
for(int i=a[];i;i--)
if(a[i]>b.a[i])
return ;
else if(a[i]<b.a[i])
return ;
return ;
}
bool operator<(const hp&b)const{
if(a[]<b.a[])
return ;
if(a[]>b.a[])
return ;
for(int i=a[];i;i--)
if(a[i]<b.a[i])
return ;
else if(a[i]>b.a[i])
return ;
return ;
}
bool operator<=(const hp&b)const{
return !(*this>b);
}
hp operator/(const hp&b)const{
hp l(),r(*this),mid;
while(l<r){
mid=(l+r+)/;
if(mid*b<=*this)
l=mid;
else
r=mid-;
}
return l;
}
void operator/=(const hp&b){
*this=*this/b;
}
}a,b,c;
char s[MAXN+];
void read(){
scanf("%s",s);
a=s;
scanf("%s",s);
b=s;
}
int main()
{
read();
c=a/b;
c.print();
puts("");
a-=c*b;
a.print();
}

Time:2017-01-28