高精度数的运算,就是将很大的数(爆int甚至long long)存放在数组中进行运算,难点主要在于进位,借助字符串加法可以较为简单的解决。
下面来看基础的高精度数加法。
string add(string str1,string str2)
{
int len1,len2;
int i,j;
len1=str1.length(),len2=str2.length();
if(len1!=len2)//为较短的字符串补0
{
if(len1>len2)
{
for(i=0;i<len1-len2;i++)
{
str2='0'+str2;
}
}
else
{
for(i=0;i<len2-len1;i++)
{
str1='0'+str1;
}
}
}
int yushu,jinwei=0;
string str3;
for(i=str1.length()-1;i>=0;i--)
{
yushu=str1[i]-'0'+str2[i]-'0'+jinwei;
jinwei=yushu/10;
str3=char(yushu%10+'0')+str3;//将int转化为string完成进位操作
}
if(jinwei!=0)
str3=char(jinwei%10+'0')+str3;//最高位的进位操作
return str3;
}
如上所示,两个不同的数相加时应先将他们的长度补为相同的再进行运算。
减法与加法类似,不再赘述。
string sub(string str1,string str2)
{
string str;
int tmp=str1.length()-str2.length();
int cf=0;
for(int i=str2.length()-1;i>=0;i--)
{
if(str1[tmp+i]<str2[i]+cf)
{
str=char(str1[tmp+i]-str2[i]-cf+'0'+10)+str;
cf=1;
}
else
{
str=char(str1[tmp+i]-str2[i]-cf+'0')+str;
cf=0;
}
}
for(int i=tmp-1;i>=0;i--)
{
if(str1[i]-cf>='0')
{
str=char(str1[i]-cf)+str;
cf=0;
}
else
{
str=char(str1[i]-cf+10)+str;
cf=1;
}
}
str.erase(0,str.find_first_not_of('0'));//去除结果中多余的前导0
return str;
}
下面是高精度数的乘法
string mul(string str1,string str2)
{
string str;
int len1=str1.length();
int len2=str2.length();
string tempstr;
for(int i=len2-1;i>=0;i--)
{
tempstr="";
int temp=str2[i]-'0';
int t=0;
int cf=0;
if(temp!=0)
{
for(int j=1;j<=len2-1-i;j++)//往tempstr后面补0
tempstr+="0";
for(int j=len1-1;j>=0;j--)
{
t=(temp*(str1[j]-'0')+cf)%10;
cf=(temp*(str1[j]-'0')+cf)/10;
tempstr=char(t+'0')+tempstr;
}
if(cf!=0) tempstr=char(cf+'0')+tempstr;
}
str=add(str,tempstr);//一步步往下加即可
}
str.erase(0,str.find_first_not_of('0'));//去除前导0
return str;
}
总体思想主要是第一个数从个位开始乘第二个数,得到的值不断相加,最后去除前导0得到结果。