题目链接:Find The Multiple
题目大意
要求你输入一个200以内的正整数n,求n的倍数要求这个倍数只由0、1组成,得到的答案的位数在100以内。符合条件的任意答案都可以。
思路
本来拿到这个题目想到可以用深搜暴力所有的01整数,但是看到输出的范围为100以内的长度。存储是个问题。但是其实如果任意答案都可以的话,n的最大值就是200那么完全用不了100那么长的数,因此深搜可行。但是如果范围再大点就危险了,写了两个版本,一个是深搜,一个广搜+同余模定理。
深搜AC代码
#include <iostream>
#include <cstdlib>
using namespace std;
long long unsigned dfs(long long unsigned n, long long unsigned num, int d){
if(n >= num){
return 0;
}
if(num%d == 0){
cout << num << endl;
return 1;
}
if(dfs(num, num*10, d)){
return 1;
}
return dfs(num, num*10+1, d);
}
int main(){
int d;
while(cin >> d && d){
dfs(0, 1, d);
}
}
广搜+同余模定理
参考:http://blog.csdn.net/lyy289065406/article/details/6647917
我尽力了,是在是有点看不懂,先放着
#include <iostream>
#include <cstdlib>
using namespace std;
/*
long long unsigned dfs(long long unsigned n, long long unsigned num, int d){
if(n >= num){
return 0;
}
if(num%d == 0){
cout << num << endl;
return 1;
}
if(dfs(num, num*10, d)){
return 1;
}
return dfs(num, num*10+1, d);
}
int main(){
int d;
while(cin >> d && d){
dfs(0, 1, d);
}
}
*/
int mod[524286];
int main(){
int n, i;
while(cin >> n && n){
mod[1] = 1;
for(i = 2; mod[i-1] != 0; i++){
mod[i] = (mod[i/2]*10 + i%2)%n;
}
i--;
int p = 0;
while(i){
mod[p++] = i%2;
i /= 2;
}
while(p){
cout << mod[--p];
}
cout << endl;
}
}