一道另人头疼的算法竞赛练习题

spidertiger 2010-04-12 01:11:50
实际项目做了不少,但很多算法却不会了。最近在翻看一本算法书,其中有一题把我给难住了,理不清思路。

题:
从 1, 2, 3 ... , 9 中选择数字构成三个 3 位数 abc, def, ghi,各不重复,但要满足 abc:def:ghi = 1:2:3。请打印出每个符合条件的结果。

我的两种思路:
1. 将 abc 从 123 循环到 329(333 * 3 = 999,三位数已到头,且 [330, 333] 之间已无符合条件的数,故直接去除)。然后检查 abc、def、ghi 构成的数字是否不重复。
2. 1 - 9 的全排列,并将对应的数字赋给 a - i,然后再测试 abc:def:ghi 是否满足 1:2:3

虽然理论上这两种都可行,且最终都能得到答案。但我总觉得这两种算法很丑,完全无美感可言~ 故求一足够简单且优雅的算法。谢谢!
...全文
122 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
soswaidao 2010-04-12
  • 打赏
  • 举报
回复
友情帮顶!!!
rtygbwwwerr 2010-04-12
  • 打赏
  • 举报
回复
第一种方法循环时可以把所有5的倍数都排除。因为如果abc是5的倍数则必有c = ghi中的i
spidertiger 2010-04-12
  • 打赏
  • 举报
回复
@baihacker:
你说的第 1 点很是启发我,其原理应该同排列的不重复选取法。非常感谢!很受用。
baihacker 2010-04-12
  • 打赏
  • 举报
回复
1.直接枚举abc撒,写起来又简单。判断重复的话可以让0对应1,1对应2,2对应4,3对应8.
然后每一位取出来,用一个flag就可以判断出来有没有重复的。
2.9!= 362880在可接受范围内啊。
如果是Topcoder之类的算法竞赛的话,我觉得第二种是最快的,然后是第一种。

3.如果只追求效果,那么事先把所有的结果都算出来,放在一个表里就行了。

4.这个就得深入分析了。
a7182388 2010-04-12
  • 打赏
  • 举报
回复
你说的不重复是生成的三个3位数,也就是总共九个数字,必须将1到9这个九个数字全部包含嘛?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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