一个很淫荡的编程练习

dxcnjupt 2007-04-15 02:17:05
输入一个自然数N,求一个最小的,由0,1组成的,可以整除N的十进制数。

最优化的结果非常之BT。

先缩小一下思路。
假设输入N位数,结果是M位数。
求N的整数倍,然后判断是否符合条件,平均需要10的(M-N)次搜索。
生成二叉树,遍历所有0,1组成的数,平均需要2的(M-N+1)次搜索,服从正态分布。
所以最优化的算法,其实是二叉树的一个广度优先遍历。
关键的问题在于最优化的二叉树实现和遍历方法。
...全文
770 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxcnjupt 2007-04-17
  • 打赏
  • 举报
回复
标题出错了,应该严肃一点的
算了
这是我自己的算法,欢迎拍砖

unsigned long Tree = 0;
while(Tree != 0xffffffff)
{
Tree++
//树遍历过程中的状态迁移,省略
......
......
}

证明如下;
任取树中的一小片,在树头,树尾或者中间都可
n-2层 1
n-1层 0 1
n层 0 1 0 1
当遍历路径穿过其中时,
假设当前状态是100。
则当遍历路径改变时,第n层0->1,其余不变
假设当前状态是101,
则当遍历路径改变时,第n层1->0,其余不变
结论:当第n层改变时,若由0->1,则上层不变;若由1->0,则上层改变。
所以,只要保存下这个二叉树每一层所处的状态,就可以通过状态迁移实现树的遍历。保存一个X层的二叉树,只需要保存X个状态。又因为每个状态只有0,1两种情况,所以只需要1个变量就可以保存下32层的二叉树。

通过累加进行遍历的证明:
根据数学归纳法,只要两种方法初始状态一样,变化规则一样,那么它们的所有状态都是一样的。
由简单的思考可知,二进制数累加1遵循的规则,和题目中的二叉树广度优先遍历规则是一样的,所以我们可以用二进制数的累加来模拟这颗树的遍历。
猪小烧 2007-04-16
  • 打赏
  • 举报
回复
?????????????
mLee79 2007-04-16
  • 打赏
  • 举报
回复
标题很YD,留个名先 ..
dxcnjupt 2007-04-16
  • 打赏
  • 举报
回复
此帖是我开,此树是我载,欲从此处过,留下买路钱

麻烦回帖的各位写下算法
实现是很简单的,高效是很苦难的
不想低调 2007-04-15
  • 打赏
  • 举报
回复
哦,mark

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧