PythonTip--8.7

取石子游戏

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

思路:
这道题我也没啥思路,在网上找了一篇相关的博客,上面讲到 了这个游戏,然后提出了一个名词叫奇异局势,关于这个奇异局势有一个公式可以计算,但是博客上面没有进行验证,我也没怎么理解,so直接按照这个公式进行编程。。。
参考的那篇链接:http://blog.renren.com/share/251405117/755224137/1

代码:

a,b = 3,1
def func(a,b):
    if a < b:
        a,b=b,a
    k = a - b
    a = (int)(k * (1 + 5.0 ** 0.5) / 2.0);
    if a == b:
        return 'Loose'
    else:
        return 'Win'
print(func(a,b))

=============分割线=============

杨辉三角

题目描述: 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
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

思路:
先分别写出n=1和2的行,因为这个不好由上面一行相加,
然后后面的每行,有上面的相对的两个数相加,第一个和最后一个都设置为1
然后输出
我用的是python3,然而网站用的是Python2,所以要把printf换一下。。。。
代码:

n =3
def func(n):
    ret = []
    if n >=1:
        ret.append([1])
        print(1)
    if n >=2:
        ret.append([1,1])
        print(1,1)
    count =2
    while count<n:
        list_ = ret[count-1]
        ret_ = [1]
        for i in range(0,count-1):
            ret_.append(list_[i]+list_[i+1])
        ret_.append(1)
        ret.append(ret_)
        for i in ret_:
            print(i,end=' ')
        print()
        count+=1

func(n)

=============分割线=============

砝码问题2

题目描述:
有一组砝码,重量互不相等,分别为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)。

思路:
创建一个队列,初始状态只有n
遍历列表w,若n%w[i]为整数,说明通过x个w[i]就能够称出n,则输出Yes
否则用n减去当前的w中的每一个数,若值大于0,说明还可以继续放砝码,那么就把这个数加入队列中。
若循环完整个队列,都没有称出,则输出No

代码:

w = [2,5,11]
n = 9
def func(w,n):
    q = [n]
    while q:
        queue = q.pop(0)
        for i in range(len(w)):
            if queue%w[i] ==0:
                return 'Yes'
            else:
                for j in w:
                    if queue-j < 0:
                        continue
                    else:
                        q.append(queue-j)
    return 'No'


print(func(w,n))

=============分割线=============

进制转换

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

思路:
这个题应该不需要什么思路,就是简单的整除和取余,只要把大于9的数转换成字母A-F
我是通过ascii码值转换的
还要考虑一下a的值是否是负数,若为负数要加上‘-’,然后取绝对值

代码:

a,b = -20,16
def func(a,b):
    c = ''
    flag= False
    if a <0:
        flag = True
        a= abs(a)
    while a:
        if a%b<10:
            c+=str(a%b)
        else:
            c += chr(a%b-10+65)
        a//=b
    if flag:
        c+='-'
    return ''.join(reversed(c))

print(func(a,b))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值