三连击(NOIP1998)

来源:互联网 发布:齐鲁商品交易软件下载 编辑:程序博客网 时间:2024/06/10 04:32

题目链接:三连击
典型的打表题,但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

原创粉丝点击