问:找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); }