题目
将 1, 2,..., 9 共 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!
。
输入格式
三个数,A,B,CA,B,C。
输出格式
若干行,每行 33 个数字。按照每行第一个数字升序排列。
解析
想用next_permutation这个函数,但是实在想不起来用法,于是暴力循环了第一个代码。
法1不仅需要mark【】数组来标记这个数组是否已经永过,还需要考虑三位数的个位、十位、百位也不相同。
其中十位的数字建议使用
l[1]=i/100;
l[2]=i/10%10;
l[3]=i%10;
暴力循环 i, j , q 这三个三位数。
法二:简洁许多。昨天的没保存就关机了。。。
代码
法1:
int A, B , C;
int mark[10];
int main() {
cin >> A >> B >> C;
int flag = 0;
for(int i = 123 ; i <= 987 ; i ++)
{
memset(mark , 0 , sizeof(mark)); mark[0] = 1;
int bai = i / 100;
// int shi = (i - bai * 100 ) / 10;
int shi = i / 10 % 10;
int ge = i % 10;
//cout << bai <<" " << shi << " " << ge << endl;
if(mark[bai] | mark[shi] | mark[ge]) continue;
if(bai == shi || shi == ge || bai == ge) continue;
mark[bai] = mark[shi] = mark[ge] = 1;
// if ( i == 156 )
// cout << i << " " << mark[1] <<" ";
for(int j = i + 1 ; j <= 987 ; j ++ )
{
int baij = j / 100;
int shij = (j - baij * 100 ) / 10;
int gej = j % 10;
if(baij == shij || shij == gej || baij == gej) continue;
if(mark[baij] | mark[shij] | mark[gej]) continue;
if(i * B != j * A ) continue;
if( j < i) continue;
// if( i == 156 ) cout << j <<" " << shij << endl;
mark[baij] = mark[shij] = mark[gej] = 1;
for(int q = j + 1 ; q <= 987 ; q ++)
{
int baiq = q / 100;
int shiq = (q - baiq * 100 ) / 10;
int geq = q % 10;
if(baiq == shiq || shiq == geq || baiq == geq) continue;
if(mark[baiq] | mark[shiq] | mark[geq]) continue;
// mark[baiq] = mark[shiq] = mark[geq] = 1;
if( q * B != j * C) continue;
cout << i <<" " << j << " " << q << endl;
flag = 1;
}
}
}
if(! flag) cout << "No!!!" << endl;
}
法2:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int A , B , C;
cin >> A >> B >> C;
int num[10] = {0 , 1, 2, 3 , 4 , 5 , 6 , 7 ,8 , 9};
int flag = 0;
do
{
int a = num[1] * 100 + num[2] * 10 + num[3];
int b = num[4] * 100 + num[5] * 10 + num[6];
int c = num[7] * 100 + num[8] * 10 + num[9];
if (a * B == b * A && a * C == c * A)
{
cout << a << " " << b << " " << c << endl;
flag = 1;
}
// cout << a << " " << b << " " << c << endl;
}while(next_permutation(num + 1, num + 10));
if ( !flag) cout << "No!!!" << endl;
}