写的有些复杂之后会把报告贴在这里。
class Solution
{
public:
string add(const string &num1, const string &num2) {//string代表的两个数相加 一位一位的相加可以避免大整数加法出现的溢出问题
const string &cStrShorter = num1.size() < num2.size() ? num1 : num2;///首先保存比较短的string和长的string
const string &cStrLonger = cStrShorter == num1 ? num2 : num1;
string sum ="";///string sum初始化为空
int iOffset = cStrLonger.size() - cStrShorter.size();///长的string和短的string相减等于抵消之后的长度
char c = 0; // 这里的c代表记录下一位的进位,下一位的进位最大为1
for (int i = cStrShorter.size() - 1; i > -1; i--) {///首先对于短的string长度的两个大整数的string进行操作
int iNumBit = cStrShorter[i] + cStrLonger[i + iOffset] + c - 96;///对应短的和长的string的加上offset之后的值一一对应,相当于做加法时候的对齐操作 char-96才是int对应的值 这里也可以-‘0’
int temp;
if (iNumBit > 9) {///大于9就进位 c=1
temp = iNumBit - 10;
c = 1;
} else {
temp = iNumBit;
c = 0;
}
sum += to_string(temp);
}
for (int i = iOffset - 1; i > - 1; i--) {
int temp = cStrLonger[i] - '0' + c;///对于更长的string比短的string多出来的部分需要进行计算,如果之前计算长的string的后面部分和短的string的相加有进位的华,这里的c也可以使用。
if (temp > 9) {
temp -= 10;
c = 1;
} else {
c = 0;
}
sum += to_string(temp);
}
if (c == 1) sum.append("1");///如果上面计算完之后还有进位代表超过了最高位,所以要在最高位添加一个1
reverse(sum.begin(), sum.end());///之前是从最低位开始计算起的,所以这里要reverse保证输出的顺序是高位到低位
return sum;
}
string minus(const string &num1,const string &num2) {
string cStrLonger="0";
string cStrShorter="0";
bool flags=0;
if(num1.size()!=num2.size())
{
cStrShorter = num1.size() < num2.size() ? num1 : num2;///首先保存比较短的string和长的string
if(num1.size()<num2.size())
{
flags=1;
}
cStrLonger = cStrShorter == num1 ? num2 : num1;
}
else
{
cStrShorter = num1 < num2 ? num1 : num2;///首先保存比较短的string和长的string
if(cStrShorter==num1)
{
flags=1;
}
cStrLonger = cStrShorter == num1 ? num2 : num1;
}
string ret(cStrLonger.size(),'0');
char step=0;// 这里的step和前面加法的c作用一致统计有没有借位
int ch=0;
for(int iL=cStrLonger.size()-1,iR=cStrShorter.size()-1;iL>=0;iL--,iR--)///两个指针从两个数的末尾开始计算,如果长的数字计算到头了,就可以停止计算。
{
ch=cStrLonger[iL]-'0'-step;
step=0;
if(iR>=0)
{
if(ch<(cStrShorter[iR]-'0'))///如果小于的话需要借位
{
step=1;
ch+=10;///这样这个数就可以+10之后再相减
}
ch-=cStrShorter[iR]-'0';//否则的话直接相减即可
}
else
{
if(ch<0)
{
step=1;
ch+=10;
}
}
ret[iL]+=ch;
}
while(ret[0]=='0'&&ret.size()>1)
{
ret.erase(ret.begin());
}
if(ret=="0")
{
return ret;
}
if(flags)
{
string ret1='-'+ret;
return ret1;
}
else
{
return ret;
}
}
string multiply(string num1, string num2) {
int flags=2;
if(num1[0]=='-')
{
num1=num1.substr(1);
flags=flags-1;
}
if(num2[0]=='-')
{
num2=num2.substr(1);
flags=flags-1;
}
if(num1=="0" or num2=="0")
{
return "0";
}
if (num1.size() == 1 and num2.size() == 1) {
if(flags==1)
{
return '-'+to_string((num1[0] - '0') * (num2[0] - '0'));
}
else{
return to_string((num1[0] - '0') * (num2[0] - '0'));
}
} else if (num1.size() == 1 and num2.size() > 1) {
string B = num2.substr(0, num2.size() / 2);
string b = num2.substr(num2.size() / 2);
string Bx = multiply(B, num1);
string bx = multiply(b, num1);
string t=Bx[0] == '0' ? bx : add(Bx + string(b.size(), '0'), bx);
if(flags==1)
{
return '-'+t;
}
else
{
return t;
}
} else if (num1.size() > 1 and num2.size() == 1) {
string A = num1.substr(0, num1.size() / 2);
string a = num1.substr(num1.size() / 2);
string Ax = multiply(A, num2);
string ax = multiply(a, num2);
string t=Ax[0] == '0' ? ax : add(Ax + string(a.size(), '0'), ax);
if(flags==1)
{
return '-'+t;
}
else
{
return t;
}
} else {
if(num1.size()!=num2.size())
{
if(num1.size()<num2.size())
{
num1=string(num2.size()-num1.size(),'0')+num1;
}
else
{
num2=string(num1.size()-num2.size(),'0')+num2;
}
}
string A = num1.substr(0, num1.size() / 2);
string a = num1.substr(num1.size() / 2);
string B = num2.substr(0, num2.size() / 2);
string b = num2.substr(num2.size() / 2);
string tA=A;
string ta=a;
string tB=B;
string tb=b;
while(tA[0]=='0'&&tA.size()>1)
{
tA.erase(tA.begin());
}
while(ta[0]=='0'&&ta.size()>1)
{
ta.erase(ta.begin());
}
while(tB[0]=='0'&&tB.size()>1)
{
tB.erase(tB.begin());
}
while(tb[0]=='0'&&tb.size()>1)
{
tb.erase(tb.begin());
}
string AB = multiply(tA, tB);
string sum = AB + string(a.size() + b.size(), '0');
while(sum[0]=='0'&&sum.size()>1)
{
sum.erase(sum.begin());
}
string ab = multiply(ta, tb);
sum = add(sum,ab);
string mAa=minus(tA , ta);
string mBb=minus(tb , tB);
string er=multiply(mAa,mBb);
string p=add(AB,ab);
while(p[0]=='0'&&p.size()>1)
{
p.erase(p.begin());
}
if(er[0]=='-')
{
p=minus(p,er.substr(1));
}
else
{
p=add(p,er);
}
if(p!="0")
{
sum = add(sum,p+string(a.size(),'0'));
}
while(sum[0]=='0'&&sum.size()>1)
{
sum.erase(sum.begin());
}
cout<<"shuchu"<<sum<<endl;
if(flags==1)
{
return '-'+sum;
}
else
{
return sum;
}
}
}
};