当前位置 博文首页 > boysoft2002的专栏:一起挑战pythontip的题目(10)

    boysoft2002的专栏:一起挑战pythontip的题目(10)

    作者:[db:作者] 时间:2021-07-27 17:51

    第46题:取石子游戏
    题目描述:有两堆石子,数量任意,可以不同。游戏开始由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。
    现在给出初始的两堆石子的数目a和b,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
    如果你是胜者,输出Win,否则输出Loose。
    例如,a=3,b=1, 则输出Win(你先在a中取一个,此时a=2,b=1,此时无论对方怎么取,你都能将所有石子都拿走).
    示例:输入:a = 2
    b = 1
    输出:Loose

    >>> a,b=2,1
    >>> print("Loose" if int(abs(a-b)*(1+5**0.5)/2)==min(a,b) else "Win")
    Loose
    >>> a,b=3,1
    >>> print("Loose" if int(abs(a-b)*(1+5**0.5)/2)==min(a,b) else "Win")
    Win
    >>> 

    注:算式虽简单但原理有点小复杂,见:《威佐夫博弈》

    ============================================================
    第47题:杨辉三角
    题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1
    ..............
    先在给你一个正整数n,请你输出杨辉三角的前n层注意:层数从1开始计数,每层数字之间用一个空格隔开,行尾不要有空格。如n=2,则输出:
    1
    1 1

    >>> def func(i):
        	t=L=[1]
        	while(i>1):
        		i-=1
        		t=L+[t[n]+t[n+1] for n in range(len(t)-1)]+L
        	return [str(t) for t in t]
    
    >>> for i in range(1,10):
        print(' '.join(func(i)))
    
        
    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1
    1 6 15 20 15 6 1
    1 7 21 35 35 21 7 1
    1 8 28 56 70 56 28 8 1
    >>> 

    ============================================================
    第48题:砝码问题II
    题目描述:有一组砝码,重量互不相等,分别为m1、m2、m3……mn;每种砝码的数量有无限个。?
    现要用这些砝码去称物体的重量,给你一个重量n,请你判断有给定的砝码能否称出重量n。?
    现在给你一个正整数列表w和一个正整数n,列表w中的第i个元素w[i]表示第i种砝码的重量,
    n表示要你判断的重量。如果给定砝码能称出重量n,输出Yes,否则输出No。
    例如,w=[2,5,11], n=9,则输出Yes(取两个2,一个5)。
    示例:输入:w = [1, 2]
    n = 18
    输出:Yes


    ============================================================
    第49题:进制转换
    题目描述:给你一个十进制数a,将它转换成b进制数,如果b>10,用大写字母表示(10用A表示,等等)
    a为32位整数,2 <= b <= 16
    如a=3,b = 2, 则输出11
    示例:输入:a = 7
    b = 2
    输出:111

    >>> def baseN(a, b):
    	'''10制数a转任意b进制数,其中b<=36'''
    	return a==0 and "0" or (baseN(a//b,b).lstrip("0") + ''.join([chr(i) for i in range(48,71) if not 57<i<65])[a%b])
    
    >>> baseN(111,2)
    '1101111'
    >>> baseN(7,2)
    '111'
    >>> baseN(177,12)
    '129'
    >>> baseN(178,12)
    '12A'
    >>> baseN(178,16)
    'B2'
    >>> hex(178)
    '0xb2'
    >>> 

    ============================================================
    第50题:Py扔铅球
    题目描述:Py不但是编程大牛,而且是运动健将。比如说扔铅球,1000m,现在Py参加校园扔铅球比赛,给你Py的身高a(双精度数),球落地点与Py头部的连线与水平线的夹角 b(弧度),
    要你编写一个程序计算Py扔铅球的水平距离。
    a,b都是浮点数,注意b是弧度,其中, 140 < a < 200, ?0 < b < 1.5.
    输出你求出的水平距离,保留到小数点后三位。
    如,a = 165.5, b=1.1, 则输出84.234
    示例:输入:a = 165.5
    b = 1.1
    输出:84.234


    ============================================================

    来源:

    Python 爬取pythontip网站的挑战题目(附全部题目178题)

    cs