将 1, 2, \ldots , 91,2,…,9 共 99 个数分成 33 组,分别组成 33 个三位数,且使这 33 个三位数构成 1 : 2 : 31:2:3 的比例,试求出所有满足条件的 33 个三位数。
时间: 2023-04-20 21:00:14 浏览: 45
将 1, 2, ..., 9 共 9 个数分别组成 3 个三位数,分别为 123, 456, 789。
剩下的 90 个数中,每连续取 3 个数组成一个三位数,共有 30 个三位数。这 30 个三位数中,1 的个数、2 的个数、3 的个数分别为 10, 10, 10。
因此,我们可以将这 30 个三位数分别乘以 1, 2, 3,得到 30 个数,分别为:
123, 126, 129, 132, 135, 138, 141, 144, 147, 150, 252, 258, 264, 270, 276, 282, 288, 294, 300, 465, 474, 483, 492, 501, 510, 519, 528, 537, 546, 555。
现在我们需要从这 30 个数中选出 3 个数,使它们的比例为 1 : 2 : 3。我们可以将这 30 个数按照从小到大的顺序排列,然后从中选出 3 个数,使它们的下标之差分别为 1, 2, 3。这样选出的 33 个三位数就满足条件了。
具体来说,我们可以先选出第一个数,然后从剩下的数中选出第二个数,使它的下标比第一个数的下标大 1,然后再从剩下的数中选出第三个数,使它的下标比第二个数的下标大 1。这样就可以得到所有满足条件的 33 个三位数了。
相关问题
用C++做这道题:将 1, 2, \ldots , 91,2,…,9 共 99 个数分成 33 组,分别组成 33 个三位数,且使这 33 个三位数构成 1 : 2 : 31:2:3 的比例,试求出所有满足条件的 33 个三位数。
这道题可以通过暴力枚举的方法解决。我们可以从 100 开始,枚举第一个三位数,然后计算出其它两个三位数,判断它们是否满足要求。具体实现可以参考以下代码:
```c++
#include <iostream>
using namespace std;
int main() {
for(int i = 100; i <= 999; i++) { // 枚举第一个三位数
int a = i;
int b = 2 * i;
int c = 3 * i;
if(b >= 1000 || c >= 1000) continue; // 如果有任意一个数超过三位数,则跳过
int cnt[10] = {0}; // 统计每个数位出现的次数
cnt[a / 100]++;
cnt[a % 100 / 10]++;
cnt[a % 10]++;
cnt[b / 100]++;
cnt[b % 100 / 10]++;
cnt[b % 10]++;
cnt[c / 100]++;
cnt[c % 100 / 10]++;
cnt[c % 10]++;
bool flag = true;
for(int j = 1; j <= 9; j++) {
if(cnt[j] != 1) { // 如果有任意一个数位出现次数不为 1,则不符合要求
flag = false;
break;
}
}
if(flag) { // 如果符合要求,则输出结果
cout << a << " " << b << " " << c << endl;
}
}
return 0;
}
```
这个程序从 100 开始枚举第一个三位数,然后计算出其它两个三位数,判断它们是否满足要求。如果满足要求,则输出结果。
组成多少种个位和十位互不相同的两位数,并输出这些数。
个位数有$1,2,3,4,5,6,7,8,9$ 共$9$个,十位数有$1,2,3,4,5,6,7,8,9$共$9$个。因为个位和十位数字不能相同,所以个位数字只有$9$个可选,而十位数字只有$8$个可选(因为不能和个位数字相同)。所以符合条件的两位数共有$9\times 8=72$个,分别是$12,13,14,\ldots,98$。