POJ-1426(Find The Multiple)--简单搜索

题目大意:给你一个整数N,让你找一整数M是N的整数倍数且整数M是由0和1组成的


解题思路:这是一道以前做过的题,不过现在再次来看,又有不同的思考。

   不过核心思想还是一个:N的范围是1~200,那么这个整数M最多不超过20位(别问我为什么,因为爱情)

   而且M上的数字不是1就是0,那么就可以用枚举的算法了;

  这里我还写了两种方法:

1、用BFS,这样思路清晰,而且效率也够快。就是在前面的情况上填1和0两种情况,不过不好想

2、用数字来表示二进制,如1表示00000000001,5表示0000000101,这样再用位运算将数字转化成M

代码:

BFS

#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define PB push_back
#define SIZE(x) (int)x.size()
#define clr(x,y) memset(x,y,sizeof(x))
#define FOR(i,n,m) for(int i=n;i<=m;i++)
#define ROF(i,n,m) for(int i=n;i>=m;i--)
#define IT iterator
#define maxn 200+5

typedef long long ll;

void RI(int& x)
{
    x=0;
    char c=getchar();
    while(!((c>='0'&&c<='9')||c=='-'))c=getchar();
    bool flag=1;
    if(c=='-')
    {
        flag=0;
        c=getchar();
    }
    while(c<='9'&&c>='0')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    if(!flag)x=-x;
}
void RII(int& x,int& y)
{
    RI(x);RI(y);
}
void RIII(int& x,int& y,int& z)
{
    RI(x);RI(y);RI(z);
}

/*************************DEADLINE*************************************/

bool vis[maxn];
int a;
queue<ll>q;
long long dfs()
{
    clr(vis,false);
    while(!q.empty())q.pop();
    q.push(1);
    while(!q.empty())
    {
        ll tem=q.front();
        q.pop();
        int n=tem%a;
        if(n==0)return tem;
        if(!vis[n])
        {
            vis[n]=true;
            FOR(i,0,1)
            {
                ll x=tem*10+i;
                q.push(x);
            }
        }
    }
}

int main()
{
    while(scanf("%d",&a),a)
    {
        printf("%lld\n",dfs());
    }
    return 0;
}

数字二进制转化

#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
#define PB push_back
#define FOR(i,n,m) for(int i=n;i<=m;i++)
#define ROF(i,n,m) for(int i=n;i>=m;i--)
#define clr(i,j) memset(i,j,sizeof(i))
#define maxn 17
typedef long long ll;
int main()
{
    int n,upper=1<<20;
    while(scanf("%d",&n),n)
    {
        ll res;
        for(int i=1;i<upper;i++)
        {
            res=0;
            ll e=1;
            for(int j=0;j<20;j++)
            {
                if((i>>j)&1)res+=e;
                e=e*10;
            }
            if(res%n==0)break;
        }
        printf("%lld\n",res);
    }
    return 0;
}

两个代码风格上有些区别,但确实是本人写的,不过写的时期不一样,所以看起来不同。

你可能感兴趣的:(搜索)