题目链接:​​三连击​​​
典型的打表题,但cgg今天不是教你怎么打表的,而是教你正解。
这题方法多样,比如递归求解也行,反正数据也不大。
在这里我提供另一种思路,我们枚举第一个数,即最小的一个数,然后分解它以及它的两倍,它的三倍的数位,然后判断是否又相同的数位,还要注意判断是否又0的存在(题目是不允许的,但这样的数却存在)。下面给出代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
int vis[11],num[11]; //1
for(int i=123;i<=329;i++){ //2
memset(vis,0,sizeof(vis)); //3
num[1]=i%10;
num[2]=i/10%10;
num[3]=i/10/10%10;
num[4]=2*i%10;
num[5]=2*i/10%10;
num[6]=2*i/10/10%10;
num[7]=3*i%10;
num[8]=3*i/10%10;
num[9]=3*i/10/10%10;
int ok=1; //4
for(int j=1;j<=9;j++){
if(vis[num[j]]==0&&num[j]!=0){ //5
vis[num[j]]=1;
}else{
ok=0;
break;
}
}
if(ok){
printf("%d %d %d\n",i,2*i,3*i);
}
}
return 0;
}

还是提5处,
1处:vis统计数位有没有用过,num保存每一个数
2处:由于位数不想重,所以最小为123,又因为i*3<=987,所以i枚举到329就行
3处:每一轮判断前要把vis清零
4处:设置标识符
5处:注意判断是不是数字0