题目描述
将 1, 2,\ldots, 91,2,…,9 共 99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:CA:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!
。
//感谢黄小U饮品完善题意
输入格式
三个数,A,B,CA,B,C。
输出格式
若干行,每行 33 个数字。按照每行第一个数字升序排列。
输入输出样例
输入 #1复制
1 2 3
输出 #1复制
192 384 576 219 438 657 273 546 819 327 654 981
说明/提示
保证 A<B<CA<B<C。
做法一:枚举第一个数的所有可能,利用公式推出另外两个数,再利用数组标记出现次数来对比
#include<bits/stdc++.h>
using namespace std;
int a , b , c , y , z , ans;
int book[10];
void f(int x){
book[x % 10]++;
book[x / 10 % 10]++;
book[x / 100]++;
}
bool check(int x , int y , int z){
memset(book , 0 , sizeof(book));
f(x); f(y) ; f(z);
for(int i = 1 ; i <= 9 ; i++)
if(!book[i]) return false;
return true;
}
int main(){
scanf("%d %d %d" , &a , &b , &c);
for(int i = 123 ; i <= 987 ; i++){
if(i * b % a || i * c % a) continue;//b / a = x / i x = i * b / a;
y = i * b / a ; z = i * c / a;
if(check(i , y , z)) {printf("%d %d %d\n" , i , y , z); ans++;}
}
if(!ans) printf("No!!!");
return 0;
}
做法二:利用next_permutation来枚举所有9个数的全排列,找到满足比例的排列
#include<bits/stdc++.h>
using namespace std;
int a , b , c , x , y , z , ans;
int arr[11];
int main(){
scanf("%d %d %d" , &a , &b , &c);
for(int i = 1 ; i <= 9 ; i++) arr[i] = i;
do{
x = arr[1] * 100 + arr[2] * 10 + arr[3];
y = arr[4] * 100 + arr[5] * 10 + arr[6];
z = arr[7] * 100 + arr[8] * 10 + arr[9];
if(x * b == y * a && y * c == z * b)
printf("%d %d %d\n" , x , y , z) , ans++;
}while(next_permutation(arr + 1 , arr + 10));
if(!ans) cout << "No!!!";
return 0;
}