poj 1426 Find The Multiple

题意:write a program to find out a nonzero multiple m of n whose decimal representation contains only the digits 0 and 1。写一个程序找出一个是n的倍数且只包含0,1的m

 

看了别人的代码,觉得他的思想特别好,由于bFS所以每次进队列的数是固定的第一个是1,第二个是10,第三个是11,第四个是110,通过推倒可知道,它是很规则的按顺序增长的,所以只要知道,进了i次队列使余数为0,则可以通过i求出、

#include<stdio.h>

const int MAXN=600000;

int mod[MAXN];

int main()

{



    int i,n;

    while(scanf("%d",&n) && n)

    {

        mod[1]=1%n;

        for(i=2;mod[i-1]!=0;i++)

            mod[i]=(mod[i/2]*10+i%2)%n;//i%2可以控制+1或+0

           //100的前一个是10,不是1000的前一个是100,又因为这是双口BFS,所以i/2

         int cas=0;

         i--;

         while(i)

         {

             mod[cas++]=i%2;

             i/=2;

         }

         for(i=cas-1;i>=0;i--)

           printf("%d",mod[i]);

         printf("\n");

    }

}

 

#include<stdio.h>

#include<queue>

#include<string.h>

using namespace std;



const int MAXN= 100010;

int step[MAXN],vis[MAXN];

queue<int>Q;

int BFS(int n,int k)

{

    memset(step,0,sizeof(step));

    memset(vis,0,sizeof(vis));

    int head,next;

    step[n]=0;

    vis[n]=1;

    Q.push(n);

    while(!Q.empty())

    {

        head=Q.front();

        Q.pop();

        for(int i=0;i<3;i++)

        {

            if(i==0) next=head-1;

            if(i==1) next=head*2;

            if(i==2) next=head+1;

            if(next>MAXN || next<0) continue;

            if(!vis[next])

            {

                Q.push(next);

                vis[next]=1;

                step[next]=step[head]+1;

            }

            if(next==k) return step[next];

        }

    }

}



int main()

{

    int n,k;

    while(scanf("%d%d",&n,&k)!=EOF)

    {

        int ans=BFS(n,k);

        printf("%d\n",ans);

    }

    return 0;

}

 

 

 

你可能感兴趣的:(find)