洛谷Luogu_P1008 三连击题解
题目描述
将1,2,⋯ ,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。
输出格式
若干行,每行333个数字。按照每行第111个数字升序排列。
解题思路
看到网上有很多的解法,这题本身也没有什么技术含量,大多用暴力循环或者深搜就行,甚至直接打表也能AC。我这里就提供一个比较取巧的判断方法,代码量相对小些,以供参考。
#include<iostream>
using namespace std;
int main() {
for (int i = 123; i <= 329; i++) {
int a = i, b = i * 2, c = i * 3, t = 0;
while (a) t |= 1 << a % 10 - 1, a /= 10;//t的第a%10位变为1
while (b) t |= 1 << b % 10 - 1, b /= 10;
while (c) t |= 1 << c % 10 - 1, c /= 10;
if ((t & 511) == 511)//9位全为1,即9个数字都出现过
cout << i << " " << 2*i << " " << 3*i << endl;
}
return 0;
}
将9个数出现的情况用二进制储存在t中,如果t的9位全为1就带表9个数字全出现过,这样的好处在于代码少了很多同时不用循环判断。