一、大整数减法
整数的表示采用string, string的begin()为高位,end()为低位。做减法时,先判断两个数字的大小,调整为大数减小数,如果两个数字位数不同,则较小的数字前面补0。
最后要删除前边产生的0,并加上负号。
string BigSubtraction(string s1, string s2)
{
string result;
bool Flag = false;
int carry = 0, len1, len2;
if(s1 == s2)
{
result = "0";
return result;
}
else if(s1.size() < s2.size())
{
swap(s1, s2);
len1 = s1.size();
len2 = s2.size();
for(int h = 0; h < len1 - len2; h++)
s2.insert(s2.begin(), '0');
Flag = true;
}
else
{ //剩下的情形是s1.size()>=s2.size()
//如果长度一样,但大小不宜样,调整位置
if(s1.size() == s2.size() && s1 < s2)
{
swap(s1, s2);
Flag = true;
}
len1 = s1.size();
len2 = s2.size();
//如果s2本身九比s1断
for(int h = 0; h < len1 - len2; h++)
s2.insert(s2.begin(), '0');
}
for(int i=s1.size() - 1; i>=0; i--)
{
if(carry + (s1[i] - '0') - (s2[i] - '0') < 0)
{
carry = carry + 10 + (s1[i] - '0') - (s2[i] - '0');
result.insert(result.begin(), carry + '0');
carry = -1;
}
else
{
carry = carry + (s1[i] - '0') - (s2[i] - '0');
result.insert(result.begin(), carry + '0');
carry = 0;
}
}
int f = 0;
while(result[f] == '0')
{
result.erase(result.begin());
}
if(Flag == true)
result.insert(result.begin(), '-');
return result;
}
二、大整数加法
首先两个大整数通过补0对齐,然后再计算。最后加上进位。
string BigAdd(string s1, string s2)
{
string c;
int carry = 0;
int len2 = s2.size() - 1;
int len1 = s1.size() - 1;
int max;
if(len1 > len2)
{
max = len1;
for(int j = 0; j < len1 - len2; j++)
s2.insert(s2.begin(), '0');
}
else
{
max = len2;
for(int h = 0; h < len2 - len1; h++)
s1.insert(s1.begin(), '0');
}
for(int i = s1.size()-1; i>=0; i--)
{
carry += s1[i] - '0';
carry += s2[i] - '0';
c.insert(c.begin(), carry%10 + '0');
carry /= 10;
}
if(carry>0)
c.insert(c.begin(), carry%10 + '0');
return c;
}
三、大整数乘法
string multiplication(string str1, string str2)
{
int maxsize = 200; //表示计算结果的长度
int a[210], b[210], c[410];
int i;
for(i = 0; i<maxsize+10; i++)
a[i] = b[i] = 0;
for(i = 0; i < maxsize*2 + 10; i++)
c[i] = 0;
int len1, len2;
len1 = str1.size();
len2 = str2.size();
int j;
for(j=0, i=len1-1; i>=0; i--)
a[j++] = str1[i] - '0';
for(j=0, i=len2-1; i>=0; i--)
b[j++] = str2[i] - '0';
for(i = 0; i < len2; i++)
{
for(j = 0; j < len1; j++)
c[i+j] += b[i]*a[j];
}
//循环处理进位
for(i = 0; i < maxsize*2; i++)
{
if(c[i] >=10)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
string Result = "";
for(i = maxsize*2; (c[i]==0)&&(i>=0); i--);
if(i>=0)
for(; i>=0; i--)
Result += c[i]+'0';
else
Result = "0";
return Result;
}