题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
//感谢黄小U饮品完善题意
输入输出格式
输入格式:
三个数,A B C。
输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。
输入输出样例
输入样例#1:
1 2 3
输出样例#1:
192 384 576
219 438 657
273 546 819
327 654 981
说明
保证A<B<C
//P1618 三连击(升级版)
// 打表就行啦
#include <iostream>
#include <vector>
using namespace std;
double num[1024];
int count = 0;
void prev() {
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
for (int k = 1; k < 10; k++) {
if (i != j && i != k && j != k) {
num[::count++] = i * 100.0 + j * 10 + k;
}
}
}
}
}
// 找相同数字的好思路
bool check(int a, int b, int c) {
int temp[10] = {false};
while (a) {
temp[a % 10] = true;
a /= 10;
temp[b % 10] = true;
b /= 10;
temp[c % 10] = true;
c /= 10;
}
for (int i = 1; i < 10; i++) {
if (temp[i] == false)
return false;
}
return true;
}
void swap(int &num1, int& num2) {
int t;
t = num1; num1 = num2; num2 = t;
}
typedef struct stg_def {
int num1;
int num2;
int num3;
bool isHave;
stg_def() :num1(-1),num2(-1),num3(-1),isHave(false){}
void sort() {
if (num1 > num2)
swap(num1, num2);
if (num1 > num3)
swap(num1, num3);
if (num2 > num3) {
swap(num2, num3);
}
}
} stg;
int main() {
vector<stg> vec;
prev();
double a, b, c;
bool isHave = false;
cin >> a >> b >> c;
for (int i = 0; i < ::count; i++) {
for (int j = 0; j < ::count; j++) {
if (i == j) continue;
// y * a b * x
if (::num[j] * a == b*::num[i]) {
stg temp;
temp.num1 = num[i]; // x
temp.num2 = num[j]; // y
vec.push_back(temp);
}
}
}
for (auto it = vec.begin(); it != vec.end(); it++) {
for (int i = 0; i < ::count; i++) {
if (b*::num[i] == c*it->num2 && a*::num[i] == c*it->num1) {
it->isHave = true;
it->num3 = num[i];
break;
}
}
}
for (auto it = vec.begin(); it != vec.end(); it++) {
if (it->isHave == true && check(it->num1, it->num2,it->num3)) {
it->sort();
isHave = true;
cout << it->num1 << " " << it->num2 << " " << it->num3 << endl;
}
}
if (isHave == false) {
cout << "No!!!" << endl;
}
return 0;
}