三连击(升级版)
题目描述
将
1
,
2
,
…
,
9
1, 2,\ldots, 9
1,2,…,9 共
9
9
9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是
A
:
B
:
C
A:B:C
A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!
。
//感谢黄小U饮品完善题意
输入格式
三个数, A , B , C A,B,C A,B,C。
输出格式
若干行,每行 3 3 3 个数字。按照每行第一个数字升序排列。
样例 #1
样例输入 #1
1 2 3
样例输出 #1
192 384 576
219 438 657
273 546 819
327 654 981
提示
保证 A < B < C A<B<C A<B<C。
upd 2022.8.3 \text{upd 2022.8.3} upd 2022.8.3:新增加二组 Hack 数据。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool areDigitsUnique(int num1, int num2, int num3)//判断输入的三个三位数是否为1-9的不重复序列
{
vector<int> digits(9, 0); // 初始化一个大小为9的向量,所有元素初始化为0
// 将第一个数的每一位添加到向量中
for (int i = 0; i < 3; ++i) {
digits[i] = (num1 % 10);
num1 /= 10;
}
// 将第二个数的每一位添加到向量中
for (int i = 0; i < 3; ++i) {
digits[i + 3] = (num2 % 10);
num2 /= 10;
}
// 将第三个数的每一位添加到向量中
for (int i = 0; i < 3; ++i) {
digits[i + 6] = (num3 % 10);
num3 /= 10;
}
// 检查数字是否在0-9之间且不重复
sort(digits.begin(), digits.end()); // 对向量进行排序
for (int i = 0; i < 8; ++i) {
if (digits[i] <= 0 || digits[i] > 9 || digits[i] == digits[i + 1]) {
return false; // 发现不满足条件
}
}
return digits[8] > 0 && digits[8] <= 9; // 最后检查最后一个数字
}
int main()
{
int a, b, c;
cin >> a >> b >> c;
if(a == 0)
{
cout << "No!!!";
return 0;
}
bool flag = 1;
for(int x = 100; x <= 999; x++)
{
if(x%a==0)
{
int y = x/a*b;
if(y<1000)
{
int z = y/b*c;
if(z < 1000)
{
if(areDigitsUnique(x, y, z))
{
cout << x <<' '<< y << " "<< z << endl;
flag = 0;
}
}
}
}
}
if(flag==1)
{
cout << "No!!!";
}
return 0;
}
运行通过!
注意
一些博客上判断1-9并且不重复中,使用求和45,乘积为362880的方式,如下图:
(i / 100 + i / 10 % 10 + i % 10 + x / 100 + x / 10 % 10 + x % 10 + y / 100 + y / 10 % 10 + y % 10 == 45)&&((i / 100 )* (i / 10 % 10) * (i % 10) * (x / 100) * (x / 10 % 10) * (x % 10) * (y / 100) * (y / 10 % 10) * (y % 10)==362880)
我来给出反例:
#include <iostream>
using namespace std;
int main()
{
//反例: 154, 294, 794
cout <<"反例:" << 77*2 << ' ' << 147*2 << ' ' << 397*2 << endl;
cout << "求和:" << 1+5+4+2+9+4+7+9+4 << endl;
cout << "乘积:" << 1*5*4*2*9*4*7*9*4 << endl;
return 0;
}
运行结果:
求和与乘积都满足,但是有重复数字,所以不过。