高进度加法
void add(string aa,string bb){
la=aa.size();
lb=bb.size();
for(int i=0;i<la;i++){
a[la-i]=aa[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=bb[i]-'0';
}
lc=max(la,lb);
for(int i=1;i<=lc;i++){
c[i]+=(a[i]+b[i])%10;
c[i+1]=(a[i]+b[i])/10;
}
if(c[lc+1]) lc++;
for(int i=lc;i>=1;i--){
cout<<c[i];
}
}
高精度减法
//相等返回0,大于返回1,小于返回-1
int compare(string s1,string s2){
if(s1.size()>s2.size()) return 1;
else if(s1.size()<s2.size()) return -1;
else return s1.compare(s2);//位数相同用compare函数进行比较
}
void sub(string aa,string bb){
//比较大小
if(compare(aa,bb)==-1){
swap(aa,bb);
cout<<"-";
}
else if(compare(aa,bb)==0){
cout<<0; return;
}
la=aa.size();
lb=bb.size();
//string->int数组,低位排在前面
for(int i=0;i<la;i++){
a[la-i]=aa[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=bb[i]-'0';
}
//计算
for(int i=1;i<=la;i++){
if(a[i]<b[i]){
a[i]+=10;
a[i+1]--;
}
c[i]=a[i]-b[i];
}
//去除多余的0,la>1防止去掉全0的情况
while(c[la]==0&&la>1) la--;
for(int i=la;i>=1;i--){
cout<<c[i];
}
}
高精度乘法
void mul(string a,string b){
la=a.size();
lb=b.size();
//string->int数组,低位排在前面
for(int i=0;i<la;i++){
a[la-i]=x[i]-'0';
}
for(int i=0;i<lb;i++){
b[lb-i]=y[i]-'0';
}
//乘法计算
for(int i=1;i<=la;i++){//从1开始
for(int j=1;j<=lb;j++){
//别忘了+号,同一个结果为是多个乘积叠加的
c[i+j-1]+=a[i]*b[j];
c[i+j]+=c[i+j-1]/10;
c[i+j-1]%=10;
}
}
//计算结果的长度(消去没有用的),方便打印
lc=la+lb;
while(c[lc]==0&&lc>1){
lc--;
}
//反向输出
for(int i=lc;i>=1;i--){
cout<<c[i];
}
}
高精度除法
//高精度除单精度
string div(string a,int b)//高精度a除以单精度b
{
string r,ans;
int d=0;
if(a=="0") return a;//特判
for(int i=0;i<a.size();i++)
{
//上一步余数*10相当与此时的被除数
r+=(d*10+a[i]-'0')/b+'0';//求出商
d=(d*10+(a[i]-'0'))%b;//求出余数
}
int p=0;
for(int i=0;i<r.size();i++)
if(r[i]!='0') {p=i;break;}
return r.substr(p);
}
int main()
{
string a;
int b;
while(cin>>a>>b)
{
cout<<div(a,b)<<endl;
}
return 0;
}
高精度取模
#include<iostream>
#include<algorithm>
using namespace std;
int mod(string a,int b)//高精度a除以单精度b
{
int d=0;
for(int i=0;i<a.size();i++) d=(d*10+(a[i]-'0'))%b; //求出余数
return d;
}
int main()
{
string a;
int b;
while(cin>>a>>b)
{
cout<<mod(a,b)<<endl;
}
return 0;
高精度阶乘
const int L=100005;
int a[L];
string fac(int n)
{
string ans;
if(n==0) return "1";
fill(a,a+L,0);
int s=0,m=n;
while(m) a[++s]=m%10,m/=10;
for(int i=n-1;i>=2;i--)
{
int w=0;
for(int j=1;j<=s;j++) a[j]=a[j]*i+w,w=a[j]/10,a[j]=a[j]%10;
while(w) a[++s]=w%10,w/=10;
}
while(!a[s]) s--;
while(s>=1) ans+=a[s--]+'0';
return ans;
}
int main()
{
int n;
while(cin>>n) cout<<fac(n)<<endl;
return 0;
}
大数进制转换
#include<stdio.h>
#include<string.h>
#define N 1020
char map[40]="0123456789abcdefghijklmnopqrstuvwxyz";
int main()
{
int m,n,i,j,sum,len,point,answer;
char ans[N],str[N];
int a[N];
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(ans,0,sizeof(ans));
memset(a,0,sizeof(a));
scanf("%s",str);
len=strlen(str);
if(len==1&&str[0]=='0')
{
printf("0\n");
continue;
}
for(i=0;str[i]!='\0';i++)
{
if(str[i]>='A'&&str[i]<='Z')
a[i]=str[i]-'A'+10;
else a[i]=str[i]-'0';
}
j=0;
while(1)
{
answer=0;
for(i=0;i<len;i++)
if(a[i]!=0)
{
answer=1;
break;
}
if(answer==0)
break;
sum=0;
for(i=0;i<len;i++)
{
sum=sum*m+a[i];
sum=sum%n;
}
ans[j++]=map[sum];
point=0;
for(i=0;i<len;i++)
{
a[i]+=point*m;
point=a[i]%n;
a[i]/=n;
}
}
for(j--;j>=0;j--)
printf("%c",ans[j]);
printf("\n");
}
return 0;
}