自己第一个通过的leetcode代码 multiply string

这段代码展示了用C++实现大整数的加法、减法和乘法运算。通过字符串处理,避免了大整数运算中的溢出问题。加法中,先确定较短和较长的字符串,然后逐位相加并处理进位;减法中,同样处理借位情况;乘法中采用了分治策略,递归地进行乘法运算。整个过程确保了计算的正确性和效率。
摘要由CSDN通过智能技术生成

写的有些复杂之后会把报告贴在这里。

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;
        }
        
    }
}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值