您的位置:首页 > 其它

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

2015-07-02 20:25 344 查看
题目大意:给你一个整数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
)
{
vis
=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;
}


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

复制去Google翻译翻译结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: