中级农民
- 积分
- 119
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-8-10
- 最后登录
- 1970-1-1
|
- #include <vector>
- #include <iostream>
- #include <string>
- using namespace std;
- class Solution{
- public:
- vector<int> additiveNum(int start, int end){
- vector<int> ret;
- for(int i = start; i <= end; i++)
- if(isAdditive(i))
- ret.push_back(i);
- return ret;
- }
- bool isAdditive(int num){
- string s = to_string(num);
- if(s.length() < 3) return false;
- for(int i = 2; i/2 <= s.length()-i; i++){ // i== length of sum of two first string
- for(int j = 1; j <= i-1; j++){ // j== length of first string
- string s1 = s.substr(0,j); // s1: 0,j-1; s2: j,i-1
- string s2 = s.substr(j,i-j);
- if(s1[0]=='0' || s2[0]=='0') break; // 0XX is not allowed
- int i1 = stoi(s1);
- int i2 = stoi(s2);
- int i3 = i1+i2;
- string s3 = to_string(i3);
- if(s.find(s3) != i) break;
- if(helper(s2,s3,s.substr(j))) return true;
- }
- }
- return false;
- }
- bool helper(string s1, string s2, string s){
- if(s.compare(s1+s2)==0) return true;
- int i1 = stoi(s1); int i2 = stoi(s2);
- int i3 = i1+i2;
- string s3 = to_string(i3);
- int pos = s1.length()+s2.length();
- if(s.find(s3) != pos) return false;
- else return helper(s2,s3,s.substr(s1.length()));
- }
- };
- int main(){
- Solution soln;
- vector<int> a = soln.additiveNum(10000,1000000);
- for(int i = 0; i < a.size(); i++)
- cout<<a[i]<<endl;
- }
复制代码 小弟不才 也贡献一个解答。
可能有corner case没有关注 欢迎指正,
效率似乎也不行,纯纯的brute force。。
不知此题有没有什么更快的方案。 |
|