思想
高精度计算的核心思想很简单,就是模拟我们笔算的过程,因此,关键在于如何准确地模拟笔算
基础代码
因为高精度乘除法中会用到高精度加减法和比较大小函数,所以就先把加减和比较函数贴出来咯
int compare(string str1,string str2) //比较字符串型的“数字”大小,相等返回0,大于返回1,小于返回-1
{
if (str1.length() > str2.length()) return 1; //长度长的整数大于长度小的整数
else if (str1.length() < str2.length()) return -1;
else return str1.compare(str2); //若长度相等,则头到尾按位比较
}
string SUB_INT(string str1,string str2);
string ADD_INT(string str1,string str2) {
//高精度加法
int sign = 1; //sign 为符号位
string str;
if (str1[0] == '-') //如果其中一个是负数,那么可以转化成高精度减法;如果都是负数,那么确定下结果为负数,然后擦除负号后相加
{
if (str2[0] == '-')
{
sign = -1;
str = ADD_INT(str1.erase(0,1),str2.erase(0,1));
}
else
{
str = SUB_INT(str2,str1.erase(0,1));
}
}
else
{
if (str2[0] == '-')
{
str = SUB_INT(str1,str2.erase(0,1));
}
else
{
int L1,L2;
L1 = str1.length();
L2 = str2.length();
if (L1 < L2) //在长度小的前面加0补齐,使得两数对齐
{
for (int i = 1;i <= L2-L1; i++) str1="0"+str1;
}
else
{
for (int i = 1;i <= L1-L2; i++) str2="0"+str2;
}
int int1 = 0,carry = 0; //carry 记录进位
for (int i = str1.length()-1;i >= 0; i--)
{
int1 = (int(str1[i])-'0'+ int(str2[i])-'0'+carry) % 10;
carry = (int(str1[i])-'0'+ int(str2[i])-'0'+carry) / 10;
str = char(int1 + '0') + str;
}
if (carry != 0) str = char(carry+'0') + str;
}
}
if ((sign==-1)&&(str[0]!='0')) str="-"+str; //处理符号位
return str;
}
string SUB_INT(string str1,string str2) {
//高精度减法
int sign=1; //sign 为符号位
string str;
int i,j;
if (str2[0] == '-') //减一个负数等于加上它的相反数
{
str = ADD_INT(str1,str2.erase(0,1));
}