1.考拉兹猜想(Collatz Sequence)
说明:假设我们选择了一些初始数字X,然后按照以下规则构建值序列:
if X is even (i.e. X modulo 2 = 0) then Xnext = X / 2 else Xnext = 3 * X + 1
也就是说,如果X是奇数,那么序列就会增加,如果是偶数,序列就会减少。例如,X=15时,我们有序列:
15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
在序列到达1之后,它进入循环1 4 2 1 4 2 1……
你的任务是计算给定的数字来计算需要多少步才能到达1。
Input data :第一行中包含的测试用例数,
第二行包含测试用例,即应该执行的计算值,
Answer 应该包含相同数量的结果,每个结果都是将Collatz序列变成1的步骤数。
input data: 3 2 15 97 answer: 1 17 118
算法如下:
1 Arrays = [2, 15, 97] 2 3 def collatz_sequence(x): 4 """构造函数计算单个数字的步骤数""" 5 seq = [x] 6 while seq[-1] > 1: 7 if x % 2 == 0: 8 seq.append(x/2) 9 else: 10 seq.append(3*x+1) 11 x = seq[-1] 12 return seq 13 14 for i in range(len(Arrays)): 15 print((len(collatz_sequence(Arrays[i])) - 1), end=' ') 16 17 # 输出 1 17 118
2.约瑟夫斯问题( Josephus Problem )
说明:这是经典的编程难题,尽管它来自古。我们可以看到,练习数学和逻辑有时可以挽救一个人的生命!大约在2000年前,有一场战争,在其中一场战斗中,一方士兵被进攻一方困在了洞穴里。为了避免被捕,被困的他们决定站成一个圈,杀掉三分之一的人,直到最后一个人,本来应该自杀的人,尽管他最终还是倾向于向敌人投降。
你可能会读到Josephus的完整故事,并在维基百科上对这个问题进行数学解释。wikipedia article
你的任务是确定给定数量的N和常数K的位置,即最后一个人的位置,也就是安全的位置。例如,如果有10个人,他们会每隔3个人除去一个人。最后剩下位置在第4的人。
N = 10, K = 3 1st round: 1 2 (3) 4 5 (6) 7 8 (9) 10 2nd round: 1 (2) 4 5 (7) 8 10 3rd round: (1) 4 5 (8) 10 4th round: 4 (5) 10 5th round: 4 (10)
Input data 包含人数N和间隔数k的,
Answer 应该包含最后留下的人的位置数,初始编号从1开始。
算法代码:
Arrays = [75, 8]
N = Arrays[0]
K = Arrays[1]
def f(n, k):
if n == 1:
return 1 # 当只有1人的时候,返回1.
return ((f(n-1, k) + (k - 1)) % n) + 1
print(f(N, K))
# 输出62