Python第二周习题集(一)(Craps游戏 质数 公约数 公倍数 回文质数 21根火柴游戏 验证码 后缀名 骰子随机和)...

# 排列组合c(n,m)

m = int(input('m = '))
n = int(input('n = '))
fm = 1
for num in range(1, m + 1):
    fm *= num
fn = 1
for num in range(1, n + 1):
    fn *= num
fmn = 1
for num in range(1, m - n + 1):
    fmn *= num
print(fm // fn // fmn)
def f(x):
    """
    求函数x的阶乘
    :param x: 任意正整数
    :return: x的阶乘
    """
    y = 1
    for z in range(1, x + 1):
        y *= z
    return y


if __name__ == '__main__':
    m = int(input('m = '))
    n = int(input('n = '))
    # 当需要计算阶乘的时候,不用再写循环,而是直接调用已经定义好的函数就可以了。
    print(f(m) // f(n) // f(m - n))

#  Craps 游戏改进版

from random import randint


def roll_dice(n=2):
    total = 0
    for _ in range(n):
        total += randint(1, 6)
    return total


# 改名字,选中要修改的名字,按中shift + F6
from random import randint
money = 1000
while money >0:
    print('玩家总资产:%d' % money)
    while True:
        debt = int(input('清下注:'))
        if 0 < debt <= money:
            break
    go_on = False

    print('玩家摇出了%d' % roll_dice())
    if roll_dice() == 7 or roll_dice() == 11:
        print('玩家胜')
        money += debt
    elif roll_dice() == 2 or roll_dice() == 3 or roll_dice() == 12:
        print('玩家输')
        money -= debt
    else:
        go_on = True
    while go_on:
        roll_dice()
        print('玩家摇出了%d' % roll_dice())
        if roll_dice() == roll_dice():
            print('玩家胜!')
            money += debt
            go_on = False
        elif roll_dice() == 7:
            print('玩家输!')
            money -= debt
            go_on = False
print('你已经破产!')

#  判断质数

from math import sqrt
def is_prime(num):

    for factor in range(2,int(sqrt(num)) + 1):
        if num  % factor == 0:
            return False
    return num !=1 and True or False
 # 通过下面的if条件,可以在导入模块时不去执行下面的代码。
# ctrl + 鼠标左键 可以查找解释定义。

if __name__ == '__main__':
    num = int(input('请输入一个数判断是不是质数:'))
    print(is_prime(num))

# 最小公倍数和最大公约数

def lcm(x, y):
    # if x > y:
    #     (x, y) = (y, x)
    '''
    求最小公倍数
    :param x: 任意正整数
    :param y: 任意正整数
    :return: x和y的最小公倍数
    '''
    (x, y) = (y, x) if x > y else (x, y)
    for i in range(y, x * y + 1):
        if i % x == 0 and i % y == 0:
            return i


def gcd(x, y):
    # if x > y:
    #     (x, y) = (y, x)
    #文档注释
    """
    计算最大公约数
    :param x: 任意正整数
    :param y: 任意正整数
    :return: 最大公约数
    """
    #
    (x, y) = (y, x) if x > y else (x, y)
    i = x
    while i > 0:
        if x % i ==0 and y % i == 0: # range(x, 0, -1) 从大到小。
            return i
        i -= 1


if __name__ == '__main__':
    x = int(input('请输入第一个数x='))
    y = int(input('请输入第二个数y='))
    print('最小公倍数:', lcm(x,y))
    print('最大公约数:', gcd(x, y))

 # 判断回文质数

from math import sqrt
def is_prime(num):

    for factor in range(2,int(sqrt(num)) + 1):
        if num  % factor == 0:
            return False
    return num !=1 and True or False
def is_palindrome(num):
    '''
    判断是不是回文数
    :param num: 非负整数
    :return: 是回文数返回True,不是回文数返回Flase.
    '''
    temp = num
    total = 0
    while temp > 0:
        total = total * 10 + temp % 10
        temp //= 10
    return num == total
#and和or运算符都是带短路功能的运算符
#如果and左边的表达式是Flase,那么右边的表达式被短路
#如果or左边的表达式是True,那么右边的表达式被短路
#所以左右两边的表达式放置的顺序可能会对执行效率产生明显的影响。
if __name__ == "__main__":
    num = int(input('请输入一个数:'))
    print(is_palindrome(num))
    if is_palindrome(num) and prime_number(num):
        print('%是回文质数' % num)
    else:
        print('%f不是回文质数' % num)

# 21根火柴的游戏,谁拿到最后一根,谁就输。每次拿的范围[1,4].保证计算机获胜。

def game_match():
    total = 21
    while True:
        my_number = int(input('请输入你拿的火柴数:'))
        if 1 <= my_number <= 4:
            com_number = 5 - my_number
            total -= 5
            print('电脑拿完还有多少根', total)
        if total == 1:
            print('你输了')
            break
        else:
            print('请输入正确的火柴数!')


if __name__ == '__main__':
    game_match()

# 21根火柴游戏公平版

from random import randint


def main():
    total = 21
    while total > 0:
        print('还剩下%d根火柴' % total)
        while True:
            num = int(input('请输入你要拿的火柴数:'))
            if 1 <= num <= 4 and num <= total:
                break
        total -= num
        print('你拿完之后还剩%d' % total)
        if total > 0:
            com = randint(1,min(4,total))
            print('电脑拿了%d根火柴' % com)
            total -= com
            if total == 0:
                print('电脑拿走了最后一根火柴,电脑输了!')
                break
        if total == 0:
            print('你拿走了最后一根火柴,你输了1')


if __name__ == '__main__':
    main()

#  根据给出的长度,生成相同长度的随机验证码,字母和数字构成的,区分大小写的。A-Z(65-90) a-z(97-122)

 

#我写的!
list1 = ''
for x in range(65, 91):
    list1 += (chr(x))
for y in range(97, 123):
    list1 += (chr(y))
for z in range(0, 10):
    list1 += 'z'
print(list1)

from random import randint


def main(x):
    """
    指定长度的验证码
    :param x: 指定长度
    :return: 生成指定长度的验证码。
    """
    list2 = ''
    for i in range(x):
        list2 += (list1[(randint(0, 61))])
    return list2


if __name__ == '__main__':
    print(main(4))

 

#老师评讲!

import random


def generate_code(code_len=4):
    """
    生成指定长度的验证码
    :param code_len: 指定长度
    :return: 由大小写字母和数字组成的指定长度的随机验证码
    """
    all_chars = '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    code = ''
    for _ in range(code_len):
        index = random.randint(0, 61)
        code += all_chars[index]
    return code


if __name__ == '__main__':

    print(generate_code())
# 根据输入的文件名,输出后缀名。
#  我写的
def main(file_name):
    position = file_name.rfind('.')
    if 0 < position < len(file_name)-1:
        suffix_name = file_name[position + 1:]
    else:
        suffix_name = ''
    return suffix_name


if __name__ == '__main__':
    file_name = input('请输入文件名:')
    print(main(file_name))
 
 
 老师讲的!加了是否带点这个功能

def get_suffix(filename, has_dot=False):
    """
    获取文件的后缀名
    :param filename:文件名
    :param has_dot: 是否带点
    :return: 文件的后缀名
    """
    pos = filename.rfind('.')
    if 0 < pos < len(filename) - 1:
        index = pos if has_dot else pos + 1
        return filename[index:]
    else:
        return ''


if __name__ == '__main__':
    print(get_suffix('.avcc'))
    print(get_suffix('hello.jpg'))
    print(get_suffix('hello.c'))

# 生成随机文件名,保证生成的文件名不会和之前的重复。 26个字母加10个数字,生成随机文件名

# 我写的
from
random import random, randint import math def main(n): list1 = [] for x in range(65, 91): list1.append(chr(x)) for y in range(0, 10): list1.append(y) print(list1) list2 = [] for i in range(n): list2.append(list1[randint(0, 35)]) return list2 if __name__ == '__main__': print(main(11))

# 骰子随机数之和,用list表示 1-(1,6)-6 2-(2,12)-11 3-(3,18)-16 4-(4,24)

# 我写的
from
random import random, randint def main(n, m): """ n个骰子,掷m次的点数和 :param n: 骰子数 :param m: 掷的次数 :return: 点数和 """ list = [] total = 0 for i in range(n, 6 * n + 1): list.append(i) print(list) for _ in range(m): total += randint(n, 6 * n) return total if __name__ == '__main__': print(main(6, 4))
#老师讲的
from random import random, randint
# 有了列表容器,我们可以使用1个变量来保存多个数据
# 更为重要的是,我们可以使用循环对列表中保存的数据进行操作。


def roll_dice(n=2):
    total = 0
    for _ in range(n):
        total += randint(1, 6)
    return total


def main():
    """
    一个骰子掷6万次,每个面出现的次数
    :return: 每个面出现的次数
    """

    f = [0] * 11
    for _ in range(60000):
        face = roll_dice()
        f[face - 2] += 1

    for index, val in enumerate(f):
        print('%d点摇出的次数%d为%.2f%%' % (index + 2, val, f[index] / 600))
    # 直接通过for-in循环对列表进行遍历。
    for counter in f:
        print(counter)


if __name__ == '__main__':
    main()

# # 设计一个函数,计算传入列表的成绩的平均分,要求去掉一个最高分和一个最低分

 

def main(n=2):
    grade_list = []
    total = 0
    for _ in range(n):
        grade = int(input('请传入成绩:'))
        grade_list.append(grade)
    # grade_list.sort()
    # grade_list = grade_list[1:-1]
    max_grade = min_grade = grade_list[0]
    for x in grade_list:
        if x > max_grade:
            max_grade = x
        if x < min_grade:
            min_grade = x
    grade_list.remove(max_grade)
    grade_list.remove(min_grade)
    for index, val in enumerate(grade_list):
        total += val
    print('平均分:%.2f' % (total / len(grade_list)))


if __name__ == '__main__':
    main()

 

#  名字加成绩,并输出最高分和最低分
def main():
    names = ['刘备', '张飞', '曹操', '袁绍', '关羽', '赵云', '周瑜']
    scores = []
    for name in names:
        score = input('请输入%s的成绩:' % name)
        scores.append(score)
    min_scores = max_scores = scores[0]
    print(scores)
    name_min = name_max = names[0]
    for s in scores:
        if s > max_scores:
            max_scores = s
            name_max = names[scores.index(s)]
        if s < min_scores:
            min_scores = s
            name_min = names[scores.index(s)]
    print('%s最高分:%s' % (name_max, max_scores))
    print('%s最低分:%s' % (name_min, min_scores))


if __name__ == '__main__':
    main()
# 设计一个函数,从传入的列表中,找出第二大的函数,只能使用一次循环。(元组)tuple(集合)set
# 自己写
def main(n=4):
    list_in = []
    for _ in range(n):
        a = input('请输入你要传入的列表:' )
        list_in.append(a)
    print(list_in)
    list_in.sort()
    a_set = set(list_in)
    list1 = list(a_set)
    # n = len(list1)
    print(list1)
    list1.sort()
    print(list1)
    second_max = list1[-2]
    print('第二大的数为', second_max)
# 老师讲
def second_max(x):
    # tuple 元组  不可更改,占的空间小一些。安全一些,能用元组,不用列表。
    """
    输出最大值和第二大的值
    :param x: 输入的列表
    :return: 返回最大值和第二大的值
    """
    (m1, m2) = (x[0], x[1]) if x[0] > x[1] else (x[1], x[0])
    for index in range(2, len(x)):
        if x[index] > m1:
            m2 = m1
            m1 = x[index]
        elif m1 > x[index] > m2:
            m2 = x[index]
    return m1, m2


def main():
    my_list = [35, 79, 92, 92, 68, 55, 40]
    print(second_max(my_list))




if __name__ == '__main__':
    main()

 

转载于:https://www.cnblogs.com/zl666/p/8537556.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Craps是一种骰子游戏,玩家在游戏中下注并掷骰子Craps的胜率决于玩家下注的类型和掷骰子的结果。以下是一些常见的下注类型和它们的胜率: 1. Pass Line Bet(赢线赌注):这是最常见的下注类型,玩家在第一次掷骰子时下注。如果掷出7或11,则玩家获胜;如果掷出2、3或12,则玩家输掉赌注;如果掷出4、5、6、8、9或10,则这个数字成为“点数”,玩家需要在后续的掷骰子中再次掷出这个点数才能获胜。胜率约为49.29%。 2. Don't Pass Bet(输线赌注):这是与Pass Line Bet相反的下注类型,如果第一次掷骰子时掷出2或3,则玩家获胜;如果掷出7或11,则玩家输掉赌注;如果掷出12,则平局;如果掷出4、5、6、8、9或10,则这个数字成为“点数”,玩家需要在后续的掷骰子中掷出7才能获胜。胜率约为47.96%。 3. Come Bet(进场赌注):这是类似于Pass Line Bet的下注类型,但是可以在任何时候下注。如果掷出7或11,则玩家获胜;如果掷出2、3或12,则玩家输掉赌注;如果掷出4、5、6、8、9或10,则这个数字成为“点数”,玩家需要在后续的掷骰子中再次掷出这个点数才能获胜。胜率约为49.29%。 4. Don't Come Bet(反进场赌注):这是类似于Don't Pass Bet的下注类型,但是可以在任何时候下注。如果掷出2或3,则玩家获胜;如果掷出7或11,则玩家输掉赌注;如果掷出12,则平局;如果掷出4、5、6、8、9或10,则这个数字成为“点数”,玩家需要在后续的掷骰子中掷出7才能获胜。胜率约为47.96%。 需要注意的是,Craps是一种纯粹的运气游戏,没有任何技巧可以提高玩家的胜率。以上胜率仅供参考,实际胜率可能会因为不同的规则和下注类型而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值