Leetcode 66. 加一 知识点:高精度加法

163 阅读1分钟

66. 加一 - 力扣(LeetCode)

思想:让digits最后一位+1,如果进位了就往前一位进1.

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
      

    vector<int> v;
    int i=0;
    if(digits[i]==0){digits[i]=1;return digits;}
 
    int n=digits.size()-1;

    for(int i=0;i<n;i++)
    {
       v.push_back(digits[i]);
    }

    digits[n]+=1;
    if(digits[n]<10)
    v.push_back(digits[n]);

    if(digits[n]>=10)
    {
        int mod=digits[n]%10;
        int chu=digits[n]/10;
        
        v.push_back(chu); 
      v.push_back(mod);
     
    }

    

    return v;
    }
};

刚开始写的这个没有考虑到全部进位,只考虑了最后一位进位,就有了如下错误:

image.png

所以我们要考虑全局进位的问题:

直接套用acwing 高精度大叔数相加模版:acwing 大数相加 - 掘金 (juejin.cn)

class Solution {
public:
const  int  N = 1e6+10;
 vector<int> c;
void sum(vector<int>& a)//引用是为了提高效率,尽可能不调用拷贝构造
{
   
     int t=1;
    
    for(int i=0;i<a.size();i++)
    {

        if(i<a.size()) t+=a[i];
    
       c.push_back(t%10);
        
        t/=10;   

    }
        if(t) 
          c.push_back(1);

reverse(c.begin(),c.end());
    }

    vector<int> plusOne(vector<int>& digits) {


vector<int> v1;

    for(int i=digits.size()-1;i>=0;i--)   //54321
    {
      v1.push_back(digits[i]);
    }    
     
   sum(v1);
    
    return c;
    }
};

eea58b4f54651e3023639721cba785d.png

第二种思想就是转化为字符串,字符串再转为数字+1

class Solution {
public:
vector<int> c;
void JUDE(vector<int>&  d)
{
    long long a=0;
    string t="";
    for(int i=0;i<d.size();i++)
    {
    t+=to_string(d[i]);
    }
    if(!t.empty())
    {
       a=stoll(t);
    }
    a+=1;

    while(a)
    {
      c.push_back(a%10);
      a/=10;
    }
    
reverse(c.begin(), c.end());  

}
    vector<int> plusOne(vector<int>& digits) {

        if(digits.empty())return c;
JUDE(digits);
    
    return c;
    }
};

image.png 例如下面 这个数字: image.png