题意:这道题输入一个正整数n,之后要求找到一个数,这个数要求为n的倍数,并且其中的每一位都需要为0或者1
这道题的突破点在于数据的范围,题目中给定的答案位数是不超过100
这很容易引起人的重视,因为如此大的数(10的100次方)就意味着用正常方法几乎不可能实现,因此应当对这个数进行适当的处理。同时注意到每个位置上只有两个选择1 0
因此使用bfs搜索进行操作,每次向后一位添加数(如果不是例题,基本想不到能用bfs。。。)
例如:
第一次:1
第二次:10 11
第三次:100 101 110 111
第四次:1000 1001 1010 1011 1100 1101 1110 1111
.。。。
依次类推
每次都保留上一次的所有状态
,并从上一次的状态展开进行合理的搜索,从上次的旧状态转移到新的状态的过程为:
上一次的数10+0 上一次的数10+1
利用这一点去进行合理的搜索,每次出现一个新的状态都将其加入到队列中,直到发现某一个数%n==0时再退出循环
注意由于数比较大,应当采用long long
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;
ll n,i,j,m;
ll a,b;
void bfs(int n)
{
queue<ll>q;
a=1;//因为第一位必为1,所以初始化为1
int flag=0;
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
for(i=0;i<=1;i++)
{
b=a*10+i;
if(b%n==0)
{
flag=1;
printf("%lld\n",b);
break;
}
q.push(b);
}
if(flag==1) break;
}
}
int main()
{
while(~scanf("%lld",&n))
{
if(n==0) break;
bfs(n);
}
return 0;
}