问:找1115244的倍数,同时这个数只能由0和1组成,最多有100位
答案是1100100001101110100。
思路:直接枚举所有二进制情况,存入unsigned long long数组里。
第一个数是1 , 之后乘以10或乘以10+1. 见下面的二叉树
1
/ \
10 11
/ \ / \
100 101 110 111
/ \ ......
1000 1001 ......
后面的可以自己在草纸上模拟。
这样就可以便利所有的由1和0组成的整数。
定理一: a[x] = a[x/2]*10 + x%2
定理二: 第i个数的最后一位是i%2
了解了这颗树的性质,直接用dfs遍历整颗树就好啦。
详细见代码:
typedef unsigned long long ll;
ll ans = 1115244;
int isp = 0; // 找到答案后,防止不必要的递归。
void dfs( ll n, int k ) // k是位数,防止超过ll的范围。
{
if ( k>19||isp==1 ) {
return ;
}
if ( n%ans==0 ) {
cout << n << endl;
isp = 1;
return ;
}
dfs(n*10,k+1);
dfs(n*10+1,k+1);
}