目录

C题目训练三连击

C题目训练【三连击】


题目描述

将 1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1:2:3 的比例,试求出所有满足条件的 3 个三位数。


方法思路

  1. 遍历可能的第一个数:第一个数的范围从100到333,因为其三倍必须不超过999。
  2. 计算后续数:根据比例关系,计算第二个数为第一个数的两倍,第三个数为第一个数的三倍。
  3. 检查数字有效性:确保这三个数都是三位数,且不包含0。同时,所有数字1到9必须恰好各出现一次。
  4. 输出结果:将满足条件的三个数按升序输出。

解决代码

#include <stdio.h>

int main() {
    // 遍历所有可能的第一个三位数,范围从100到333
    for (int a = 123; a <= 333; a++) {
        // 计算第二个和第三个数
        int b = 2 * a;
        int c = 3 * a;
        
        // 初始化一个数组来计数每个数字的出现次数
        int count[10] = {0};
        int num = a;
        
        // 分解第一个数的每一位并计数
        while (num) {
            count[num % 10]++;
            num /= 10;
        }
        
        num = b;
        // 分解第二个数的每一位并计数
        while (num) {
            count[num % 10]++;
            num /= 10;
        }
        
        num = c;
        // 分解第三个数的每一位并计数
        while (num) {
            count[num % 10]++;
            num /= 10;
        }
        
        // 检查数字1到9是否每个恰好出现一次
        int valid = 1;
        for (int i = 1; i <= 9; i++) {
            if (count[i] != 1) {
                valid = 0;
                break;
            }
        }
        
        // 如果满足条件,输出结果
        if (valid) {
            printf("%d %d %d\n", a, b, c);
        }
    }
    return 0;
}

代码解释

  1. 遍历第一个数a:从123到333,确保其三倍不超过999。
  2. 计算b和c:b为a的两倍,c为a的三倍。
  3. 检查0的存在:如果a、b或c的任何位为0,跳过当前循环。
  4. 数字频率统计:使用数组count统计每个数字的出现次数。
  5. 验证数字使用:检查1到9每个数字是否恰好出现一次。
  6. 输出结果:如果满足条件,输出a、b和c的值。