[Python] (中上难度) 五道高质量例题+详解 算法 奇数个数 求值 猴子分桃 淘汰游戏

1.奇数个数

题目:

计算0—7所能组成的

解析:

代码一:

假设范围为1-8位数的数字,假设sum=s=4是因为个位时只有1,3,5,7四个奇数,循环从两位数开始遍历:

当 j <= 2 时,执行 s *= 7 。是因为对于两位数的奇数,十位只有 7 种选择(因为 0 - 7 共 8 个数字,但首位不能为 0 )。

当 j > 2 时,执行 s *= 8 。因为从第三位数字开始,每多一位数字就多 8 种选择(因为这个时候在十位上放 0 - 7 都可以)。

代码二:

假设组成最大数为7777,逐一循环遍历

先判断每一个数字是不是由0-7组成,再判断是不是奇数

代码:

# 解法一
sum = 4
s = 4
for j in range(2,9):
    print(sum)
    if j <= 2:
        s *= 7
    else:
        s *= 8
    sum += s
print('sum = %d' % sum)
# 输出:
4
32
256
2048
16384
131072
1048576
sum = 8388608
# 解法二:
def count_odd_numbers():
    count = 0
    for i in range(1, 8000):  # 0 - 7 组成的最大数为 7777
        num_str = str(i)
        all_valid = True
        for digit in num_str:
            if int(digit) not in range(8):
                all_valid = False
                break
        if all_valid:
            if int(num_str[-1]) % 2 == 1:  # 检查个位是否为奇数
                count += 1
    return count

print(count_odd_numbers())
# 输出:
2048


# 和解法二一样思路,换种写法
def count_odd_numbers():
    count = 0
    for i in range(1, 8000):
        num_str = str(i)
        digit_list = [int(d) for d in num_str]
        if all(d in range(8) for d in digit_list) and digit_list[-1] % 2 == 1:
            count += 1
    return count

print(count_odd_numbers())

2.求值

题目:

809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果

解析:

这道题有一个迷惑点,就是809*??=800*??+9*??+1这个式子本身就是不可能成立的,所以这道题的关键点就是求出一个值同时满足8*??的结果为两位数,9*??的结果为3位数即可

代码:

for num in range(10, 100):
    if len(str(8 * num)) == 2 and len(str(9 * num)) == 3:
        print(f"??代表的两位数是:{num}")

# 输出
??代表的两位数是:12

3.猴子分桃

题目:

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

解析:

i代表第几个猴子,j代表每一份桃子数,x代表总的桃子数

while(i<5)代表,用i记录往回推的猴子数,从第0个到第4个是五个,只有当能推到第五个猴子也就是i=5时才退出while,否则j,也就是每一份的桃子数就会+1,一直加到满足条件

改变循环条件变量i的语句在for循环里面,因为每一次重新进行while循环就代表重新从第0个开始往回推,x=4*j是假设的最后剩下的,所以里面的for循环用来真正往回推,能被四整除代表能往回推因为剩下的是被分成五份后拿走了一份的,所以一定能被分成四份,不能就break,这个时候没有成功推回去5次,就会重新进行while循环,能就往前推,公式是x = (x / 4) * 5 + 1

代码:

i = 0
j = 1
x = 0
while (i < 5):
    x = 4 * j
    for i in range(0, 5):
        if (x % 4 != 0):
            break
        else:
            i += 1
        x = (x / 4) * 5 + 1
    j += 1
print(x)
# 输出
3121.0

4.淘汰游戏

题目:

有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

解析:

把所有人按顺序放入num列表中,如果num[i]=0代表已经退出圈子,k代表当前报到的数字,m代表退出圈子的人数,所以while循环的条件是只剩下最后一个人。num[i]!=0,代表这个位子的人还在,开始报数,报到3的时候退出去一个人,k=0从0重新开始报数,i=n代表遍历完所有人,重新开始遍历,最后输出num[i]不为0的人号数就是最后留下的

代码:

n = int(input('请输入总人数:'))
num = []
for i in range(n):
    num.append(i + 1)
i = 0  # 遍历所有人
k = 0  # 当前报的数
m = 0  # 退出圈子的人数
while m < n - 1:
    if num[i] != 0 : k += 1
    if k == 3:
        num[i] = 0    # 退出
        k = 0    # 重新报数
        m += 1
    i += 1
    if i == n : i = 0    # 遍历完所有人再重新遍历
i = 0
while num[i] == 0: i += 1
print(num[i])

5.分解质因子

题目:

编写一个程序,用于对一个数进行分解质因子

解析:

思路没什么大问题,就是注意会有重复因子,所以找到一个因子后要再重复判断还能不能再除这个因子,这里result是一个列表,str1+='*'.join(result)可以把列表用*连接并转换为字符串再和str1连接

代码:

n=int(input('please input n:'))
result=[]
i=2
str1=str(n)+'='
while n>1:
   if n%i==0:
       n/=i
       result.append(str(i))
       i -= 1     # 重复因子
   i +=1
str1+='*'.join(result)
print(str1)
  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值