任意给定一个正整数 N,求一个最小的正整数 M ( M>1 ),使得 N*M 的十进制表示形式里只含有 1 和 0.
假设对所有的 1,0 组合数字进行搜索 ,则形成一个树
1
10 11
100 101 110 111
…
n 层的书,第 k 层树个数 2^(k-1) 假设数字在m层总搜索次数为 o(2^m),改进:
假设 x y 为树中两个数 x%M == y%M ,则 10*x%M == 10*y%M (10*x+1) %M==(10*y+1)
则 假设 x < y 则 y 所在的子树实际上已经剪枝,该子树不需要在考虑了。
树结点访问问题:
可以用队列实现层次结构访问,在访问的同时进行剪枝。
function getMinInt(n) { if(n==1) return 1; //利用队列层次遍历 var queue=[]; queue.push({ value : 1, remainer : 1 }); var knownRemainers={}; while(true){ var r=queue.shift(); if(r.remainer==0) return r.value/n; for(var i=0;i<2;i++) { var nextVlaue=r.value*10+i; var nextRemainer=(r.remainer*10+i)%n; //相同余数剪枝操作 if(!knownRemainers[nextRemainer]) { knownRemainers[nextRemainer]=true; queue.push({ value : nextVlaue, remainer : nextRemainer }); } } } } (function() { alert(getMinInt(3)); })();