题解
【基础】趣味填空
1 条题解
-
0
解题思路
枚举加号插入的每个位置,分别计算左右两部分,检查它们的和是否等于等号右边。
参考代码
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; int k = s.find('='); string a = s.substr(0, k); long long b = 0; // 计算等号右边的整数。 for (int i = k + 1; i < (int)s.size(); i++) b = b * 10 + s[i] - '0'; for (int i = 1; i < (int)a.size(); i++) { long long x = 0, y = 0; // 计算加号左边的整数。 for (int j = 0; j < i; j++) x = x * 10 + a[j] - '0'; // 计算加号右边的整数。 for (int j = i; j < (int)a.size(); j++) y = y * 10 + a[j] - '0'; // 找到满足等式的分法后立即输出并结束。 if (x + y == b) { cout << x << "+" << y << "=" << b; return 0; } } // 所有插入位置都不成立时输出题目规定的文字。 cout << "Impossible!"; return 0; }复杂度分析
代码只使用了简单变量、循环和字符串。设输入长度为 n,时间复杂度为 O(n^2)(若有嵌套枚举则按实际循环计算),额外空间复杂度为 O(n)。
- 1