以下是三种高精度算术的模版:
高精度加法:
string s="0123456789",s1,s2;
int ss1[1005],ss2[1005],len; void dashu(string s1,int ss1[])
{
for(int i=s1.length()-1;i>=0;i--)
{
for(int j=0;j<10;j++)
{
if(s[j]==s1[i])
ss1[s1.length()-1-i]=j;
}
}
} void dashu_add(int ss1[],int ss2[])
{
int len1=s1.length(),len2=s2.length();
if(len1>len2)
len=len1;
else
len=len2;
for(int i=0;i<len;i++)
{
ss1[i]+=ss2[i];
if(ss1[i]>=10)
{
ss1[i+1]+=ss1[i]/10;
ss1[i]%=10;
}
}
int l=-1;
for(int i=len;i>=0;i--)
{
if(ss1[i]!=0)
{
l=i;
break;
}
}
if(l>=0)
{
for(;l>=0;l--)
cout<<ss1[l];
}
else
cout<<0;
}相关题目链接:HDU 1002
高精度乘法:
void bignum_fac(int n)
{
int a[100000];
int m=1,b,d,i,j;
memset(a,0,sizeof(a));
a[1]=1;
for(i=2;i<=n;i++)
{
d=0;
for(j=1;j<=m;j++)
{
b=a[j]*i+d;
a[j]=b%100000;
d=b/100000;
}
if(d)
{
a[++m]=d;
}
}
cout<<a[m];
for(j=m-1;j>0;j--)
{
printf("%05d",a[j]);
}
printf("\n");
}相关题目链接:HDU 1042
高精度除法:
char s[1005];
char division[1005];//存储进行高精度除法的数据 bool bignum_div(int x)
{
int tot=0,num=0;
for(int i=0;s[i];i++)
{
num=num*10+s[i]-'0';
division[tot++]=num/x+'0';
num%=x;
}
division[tot]='\0';//利于进行strcpy()
if(num==0) //有适合的除数
{
int i=0;
while(division[i]=='0')
i++;
strcpy(s,division+i);//比如49->07,那么下一轮s就变成7,多余的i个0都除掉
return true;
}
else return false;
}相关题目链接:POJ 2325