zoukankan      html  css  js  c++  java
  • 算法学习(三)

    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
  • 相关阅读:
    mysql 数据操作 单表查询 group by 注意
    mysql 数据操作 单表查询 group by 聚合函数
    mysql 数据操作 单表查询 group by 聚合函数 没有group by情况下
    mysql 数据操作 单表查询 group by 介绍
    【洛谷P3586】LOG
    【YbtOJ#20078】路径之和
    【ABC181】F
    【洛谷P7045】金牌
    【AT2165】Median Pyramid Hard
    【洛谷P3708】koishi的数学题
  • 原文地址:https://www.cnblogs.com/zt19994/p/7359622.html
Copyright © 2011-2022 走看看