这道题题目大意是给出一个数n,找出一个数要求是n的倍数,并且这个数的十进制只由1和0组成,明显这样的数不止一个(如果,满足条件一定会有m×10也满足,故不止一种),题目要求输出任意一个满足该条件的m,对于给出的一个数2,可知2×5=10,故答案可以得出是10(当然,100,1000...也满足,但是special judge,只用输出一个满足条件的解),其他数据也同理。
思路很简单:每一位枚举0或1,位数逐渐往后增加即可,Bfs与Dfs都行。
Bfs代码:
#include<stdio.h>
#include<queue>
#define LL long long
using namespace std;
void Bfs(int n){
queue<LL>q;
q.push(1); //从1开始枚举
while(1){
LL s=q.front();
q.pop();
if(s%n==0){
printf("%lld\n",s);
return;
}
q.push(s*10); //位数增加
q.push(s*10+1);
}
}
int main()
{
int n;
while(scanf("%d",&n)&&n){
Bfs(n);
}
return 0;
}
Dfs代码(位数大概搜到十九位左右,因为到20位时64位整数存不下):
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
bool found;
void DFS(unsigned __int64 t ,int n,int k)
{
if(found)
return ;//如果已经发现了答案就没搜的必要了
if(t%n==0)
{//发现答案,输出,标记变量该true
printf("%I64u\n",t);
found=true;
return ;
}
if(k==19)//到第19层,回溯
return ;
DFS(t*10,n,k+1); //搜索×10
DFS(t*10+1,n,k+1); //搜索×10+1
}
int main()
{
int n;
while(cin>>n,n)
{
found=false;//标记变量,当为true代表搜到了题意第一的m
DFS(1,n,0); //从1开始搜n的倍数,第三个参数代表搜的层数,当到第19层时返回(因为第20层64位整数存不下)
}
return 0;
}