题目
解法
这道题目其实不难,纯粹的步骤多点,一开始自己写的时候没有好好审题,做了一些无用功从而导致解题的精力被浪费掉一部分。
解题的关键就在1 和 2 的数据上,穷尽前两个的排序才能继续进行下去
都是常用的代码,字符串模拟运算,斐波那契数列的检验
提醒一下,不要被 回溯 给干扰自己对穷举的判断
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| bool StringTopic::isAdditiveNumber(string num) { int n = num.length(); for (int secondStart = 1; secondStart < n-1; ++secondStart) { if (num[0] == '0' && secondStart != 1) { break; } for (int secondEnd = secondStart; secondEnd < n - 1; ++secondEnd) { if (num[secondStart] == '0' && secondStart != secondEnd) break; if (Valid(secondStart, secondEnd, num)) return true; } } return true; }
bool Valid(int secondStart, int secondEnd, string num) { int n = num.size(); int firstStart = 0, firstEnd = secondStart - 1; while (secondEnd <= n - 1) { string third = StringAdd(num, firstStart, firstEnd, secondStart, secondEnd); int thirdStart = secondEnd + 1; int thirdEnd = secondEnd + third.size(); if (thirdEnd >= n || !(num.substr(thirdStart, thirdEnd - thirdStart + 1) == third)) { break; } if (thirdEnd == n - 1) { return true; } firstStart = secondStart; firstEnd = secondEnd; secondStart = thirdStart; secondEnd = thirdEnd; } return false; }
string StringAdd(string s, int firstStart, int firstEnd, int secondStart, int secondEnd) { string third; int carry = 0, cur = 0; while (firstEnd >= firstStart || secondEnd >= secondStart || carry != 0) { cur = carry; if (firstEnd >= firstStart) { cur += s[firstEnd] - '0'; --firstEnd; } if (secondEnd >= secondStart) { cur += s[secondEnd] - '0'; --secondEnd; } carry = cur / 10; cur %= 10; third.push_back(cur + '0'); } ranges::reverse(third); return third; }
|