- gf25002 的博客
高精度
- @ 2026-4-12 22:30:51
加法
#include<iostream>
using namespace std;
string sa,sb;
int a[10005],b[10005],c[10005];
int main(){
cin>>sa>>sb;
int al=sa.size(),bl=sb.size(),cl=max(al,bl);
for(int i=0;i<al;i++)a[al-i-1]=sa[i]-'0';
for(int i=bl-1,j=0;i>=0;i--,j++)b[j]=sb[i]-'0';
for(int i=0;i<cl;i++)c[i]=a[i]+b[i];
for(int i=0;i<cl;i++)if(c[i]>9)c[i+1]+=c[i]/10,c[i]=c[i]%10;
if(c[cl])cl++;
for(int i=cl-1;i>=0;i--)cout<<c[i];
}
return 0;
减法
#include<iostream>
using namespace std;
string aa,bb;
bool flag=0;
int a[1005],b[1005],c[1005];
int main(){
cin>>aa>>bb;
int la=aa.size(),lb=bb.size();
if(la<lb||(la==lb&&aa<bb)){
flag=1;
swap(aa,bb),swap(la,lb);
}
for(int i=0;i<la;i++)a[i]=aa[la-i-1]-'0';
for(int i=0;i<lb;i++)b[i]=bb[lb-i-1]-'0';
for(int i=0;i<la;i++)c[i]=a[i]-b[i];
for(int i=0;i<la;i++)if(c[i]<0)c[i+1]--,c[i]+=10;
int lc=la;
while(lc>0&&!c[lc])lc--;
if(flag)cout<<"-";
for(int i=lc;i>=0;i--)cout<<c[i];
return 0;
}
乘法
#include<iostream>
using namespace std;
string aa,bb;
int flaga=1,flagb=1,begina,beginb,a[1005],b[1005],c[1005];
int main(){
cin>>aa>>bb;
int la=aa.size(),lb=bb.size(),lc=la+lb;
if(aa[0]=='-')flaga=-1,begina=1;
if(bb[0]=='-')flagb=-1,beginb=1;
for(int i=begina;i<la;i++)a[i-begina]=aa[la-i-1+begina]-'0';
for(int i=beginb;i<lb;i++)b[i-beginb]=bb[lb-i-1+beginb]-'0';
for(int i=0;i<la;i++)for(int j=0;j<lb;j++)c[i+j]+=a[i]*b[j];
for(int i=0;i<lc;i++)c[i+1]+=c[i]/10,c[i]%=10;
while(lc>0&&!c[lc])lc--;
if(flaga*flagb<0)cout<<'-';
for(int i=lc;i>=0;i--)cout<<c[i];
return 0;
}
高精度除以单精度
#include<iostream>
#include<cstring>
using namespace std;
char s[110];
int a[110],c[110],x=0,b,len,i,p;
int main(){
cin>>s>>b;
len=strlen(s);
for(i=0;i<len;i++)a[i]=s[i]-'0';
for(i=0;i<len;i++)c[i]=(x*10+a[i])/b,x=(x*10+a[i])%b;
p=len-1;
for(i=0;i<len;i++)if(c[i]!=0){p=i;break;}
for(i=p;i<len;i++)cout<<c[i];
}
阶乘
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_DIGITS=40000;
int main(){
int N,carry=0,factorial[MAX_DIGITS]={0};
cin>>N;
if(N<0)return 1;
if(N==0||N==1){
cout<<"1";
return 0;
}
factorial[0]=1;
int current_length=1;
for(int i=2;i<=N;++i){
for(int j=0;j<current_length;++j){
int product=factorial[j]*i+carry;
factorial[j]=product%10,carry=product/10;
}
while(carry>0)factorial[current_length]=carry%10,carry/=10,current_length++;
}
for(int i=current_length-1;i>=0;--i)cout<<factorial[i];
return 0;
}