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