三连击(NOIP1998)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值