码迷,mamicode.com
首页 > 编程语言 > 详细

一道算法题

时间:2016-07-31 20:43:45      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

据说,李嘉诚的保险柜密码是一个 8 位的数字。他经常更换密码,但换密码的规则很简单,每次都把密码的数字 * 3,如果有位数溢出,就把最前面的那个数字挪到整个数字末尾加起来 —— 比如 98765432 就会变成 98765432 * 3 = 296296296, 但是这有 9 位, 把最前面的 2 加到末尾, 变成 96296298, 就是新密码。现在我们偷到了李嘉诚的保险柜,而且我们知道他最初的密码是 00000001, 已经迭代了 n 次,求一个算法,可以在 O(log n) 的时间内算出密码。

 1 def g(x):
 2     return x % 1000000000 + x // 1000000000
 3 
 4 def f(x):
 5     if x == 1:
 6         return 3
 7     elif x % 2 == 0:
 8         return g(f(x / 2) * f(x / 2))
 9     elif x % 2 == 1:
10         return g(f(1) * f(x - 1))
11 
12 if __name__ == __main__:
13     print(f(47))

哈哈,:)

迭代分析:

技术分享

一道算法题

标签:

原文地址:http://www.cnblogs.com/gotodsp/p/5723743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!