200字
Luogu P1008 [NOIP 1998 普及组] 三连击
2025-10-01
2025-10-01

思路

  1. 遍历可能的第一个数:从123到333枚举第一个数a(因为3a≤999)

  2. 生成三个数:第二个数为2a,第三个数为3a

  3. 检查数字使用情况

    • 将三个数的每一位数字提取出来

    • 检查是否恰好使用了1-9的所有数字

    • 检查是否没有0出现

    • 检查每个数字只出现一次

  4. 输出有效组合:满足条件的三位数组合

代码实现

#include <iostream>
using namespace std;

int main() {
    for (int a = 123; a <= 333; a++) {
        int b = 2 * a;
        int c = 3 * a;
        int count[10] = {0};  // 数字0-9出现次数计数器
        int tmp;

        // 检查第一个数
        tmp = a;
        while (tmp) {
            count[tmp % 10]++;
            tmp /= 10;
        }

        // 检查第二个数
        tmp = b;
        while (tmp) {
            count[tmp % 10]++;
            tmp /= 10;
        }

        // 检查第三个数
        tmp = c;
        while (tmp) {
            count[tmp % 10]++;
            tmp /= 10;
        }

        // 验证1-9每个数字恰好出现一次且没有0
        bool valid = (count[0] == 0);
        for (int i = 1; i <= 9; i++) {
            if (count[i] != 1) {
                valid = false;
                break;
            }
        }

        if (valid) {
            cout << a << " " << b << " " << c << endl;
        }
    }
    return 0;
}

当然,答案也需要附上

192 384 576
219 438 657
273 546 819
327 654 981
PS:不知道这种形式好不好,因为第一次写这样提交答案的题目

评论