C题目训练【三连击】
文章目录
- 题目描述
- 方法思路
- 解决代码
- 代码解释
题目描述
将 1,2,…,9 共 9 个数分成 3 组,分别组成 3 个三位数,且使这 3 个三位数构成 1:2:3 的比例,试求出所有满足条件的 3 个三位数。
方法思路
- 遍历可能的第一个数:第一个数的范围从100到333,因为其三倍必须不超过999。
- 计算后续数:根据比例关系,计算第二个数为第一个数的两倍,第三个数为第一个数的三倍。
- 检查数字有效性:确保这三个数都是三位数,且不包含0。同时,所有数字1到9必须恰好各出现一次。
- 输出结果:将满足条件的三个数按升序输出。
解决代码
#include <stdio.h>int main() {// 遍历所有可能的第一个三位数,范围从100到333for (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;
}
代码解释
- 遍历第一个数a:从123到333,确保其三倍不超过999。
- 计算b和c:b为a的两倍,c为a的三倍。
- 检查0的存在:如果a、b或c的任何位为0,跳过当前循环。
- 数字频率统计:使用数组count统计每个数字的出现次数。
- 验证数字使用:检查1到9每个数字是否恰好出现一次。
- 输出结果:如果满足条件,输出a、b和c的值。