任意给定一个正整数 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));
})();
求特定倍数的1和0组合
本文介绍了一个算法,用于寻找给定正整数N的最小正整数M(M>1),使得N*M仅由1和0组成。通过构建搜索树并使用队列进行层次遍历来实现,同时采用剪枝策略减少不必要的计算。
8847

被折叠的 条评论
为什么被折叠?



