top1编程
← 返回题目
题解

【基础】趣味填空

1 条题解

  • 0
    @ 2026-7-30 1:34:20

    解题思路

    枚举加号插入的每个位置,分别计算左右两部分,检查它们的和是否等于等号右边。

    参考代码

    #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