additive number[类斐波那契判断]

参考自:https://blog.csdn.net/x_i_y_u_e/article/details/50724390

Additive number is a string whose digits can form additive sequence. 
A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the sequence must be the sum of the preceding two. 
For example: 
“112358” is an additive number because the digits can form an additive sequence: 1, 1, 2, 3, 5, 8. 
1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8 
“199100199” is also an additive number, the additive sequence is: 1, 99, 100, 199. 
1 + 99 = 100, 99 + 100 = 199 
Note: Numbers in the additive sequence cannot have leading zeros, so sequence 1, 2, 03 or 1, 02, 3 is invalid. 
Given a string containing only digits ‘0’-‘9’, write a function to determine if it’s an additive number. 
Follow up: 

How would you handle overflow for very large input integers?

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

string s;
long L;
bool isAdditive(string rem,long num1,long num2){
    if(rem=="")return true;
    long sum=num1+num2;
    string ss="";
    while(sum!=0){
        int temp=sum%10;
        ss+=(temp+'0');
        sum/=10;
    }
    reverse(ss.begin(),ss.end());
    cout<<num1<<' '<<num2<<' ';
    cout<<ss<<'\n';
    sum=num1+num2;
    if(rem.find(ss)==0)return isAdditive(rem.substr(ss.length()),num2,sum);
    else {
        return false;
    }
}
long stol(string x){//将字符串转换为long
    int l=x.length();
    long num=0;
    for(int i=0;i<l;i++){
        num=num*10+(x[i]-'0');
    }
    return num;
}
int main()
{
   // freopen("1.txt","r",stdin);
    cin>>s;
    L=s.size();
    string s1,s2;
    long num1,num2;
    bool flag=false;
    for(int i=0;i<L/2-1;i++){
        if(s[i]=='0'&&i>=1)break;
        for(int j=i+1;(L-j)>=i&&(L-j)>=j-i;j++){
            if(s[j]=='0'&&j-i>1)break;
            s1=s.substr(0,i+1);//这里必须是i+1,这样才能从0开始截取正常。
            s2=s.substr(i+1,j-i);
//            num1=atol(s1);
//            num2=atol(s2);
              num1=stol(s1);
              num2=stol(s2);
            if(isAdditive(s.substr(j+1),num1,num2)){
                //就递归去判断了。
                flag=true;break;
            }
        }
        if(flag)break;
    }
    if(flag)
        cout<<"yes";
    else
        cout<<"no";
    return 0;

}

PS:没看解之前觉得很难,之后还觉得比较好理解,前后有1.25h,

1.第一层for循环是确定第一个数的,第二层for循环是确定第二个数。

2.注意i的长度范围,注意j的长度范围(考虑到第三个数),满足什么长度条件。

3.在isAdditive里递归判断 和字符串是不是当前的开头。

猜你喜欢

转载自blog.csdn.net/huanting74/article/details/80589419
今日推荐