练习题(丑数,五人分鱼,输入日期判断天数)

习题:

1. 判断一个数是否是丑数:

丑数:把只包含质因子2,3和5的数称作丑数。例如6、8都是丑数,但7、14不是,因为它们包含质因子7。

我的解释:这里涉及到一个叫做质因子的知识点,即,质数+因子

丑数对偶数因子不做执行,直接跳过,但质数因子就需要判断是否是3或者是5,当因子全部判断完符合丑数才输出,否则出现不符合丑数情况一次即输出非丑数。

num = int(input("enter a number:"))
yingzi=[]
for i in range(1,num+1):
    if num%i==0:
        yingzi.append(i)
print(yingzi)
#需要注意的是因子里含有[1]因子,且任意一个大于0的数据的因子都含有1,因此我做了一次删除,就为了删掉因子1
yingzi.pop(0)
print(f'列表长度变成{len(yingzi)}')
count=0
if len(yingzi) == 0:
    print(f'{num}不是一个丑数')
for j in yingzi:
    if (j%2!=0 and (j==3 or j==5)) or j%2==0:
        count+=1
        if count<len(yingzi):
            pass
        else:
            print(f'{num}是一个丑数')
    else:
        print(f'{num}不是一个丑数')
        break

输出结果:
在这里插入图片描述

思考一下进一步从求一个丑数上升到多个:
问:100以内的丑数有哪些呢?

yingzi = []
nunIsNotUgrlt = []
nunIsUgrlt = [1]
for num in range(2, 100):
    for i in range(1, num+1):
        if num % i == 0:
            yingzi.append(i)
    # print(yingzi)
    yingzi.pop(0)
    # print(f'列表长度变成{len(yingzi)}')
    count = 0
    if len(yingzi) == 0:
        # print(f'{num}不是一个丑数')
        nunIsNotUgrlt.append(num)
    for j in yingzi:
        if (j % 2 != 0 and (j == 3 or j == 5)) or j % 2 == 0:
            count += 1
            if count < len(yingzi):
                pass
            else:
                nunIsUgrlt.append(num)
                # print(f'{num}是一个丑数')
        else:
            # print(f'{num}不是一个丑数')
            nunIsNotUgrlt.append(num)
            break
    yingzi.clear()
for d in nunIsUgrlt:
    # print(f'100以内的丑数是{d}')
    print(d, end=',')
print(f'总共有{len(nunIsUgrlt)}个')

得到的结果:1,2,3,4,5,6,8,10,12,16,20,24,32,40,48,64,80,96,总共有18个

2. 五人分鱼。

A、B、C、D、E 五人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A 第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。 B 第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉拿走自己的一份。 C、D、E依次醒来,也按同样的方法拿鱼。问他们至少捕了多少条鱼?

方法一、

fish = 1
while True:
    count=0
    total, enough = fish, True
    for i in range(5):
        if (total - 1) % 5 == 0:
            count+=1
            total = (total - 1)  //  5 * 4
        else:
            count=0
            enough = False
            break
    if enough:
        print(f'总共有{fish}条鱼')
        break
    fish += 1

结果输出:总共有3121条鱼

方法二、

num = 1
while True:
    count=0
    total = num
    for i in range(4):#从E到下一位D,D到下一位C,C到下一位B,B到下一位A,共四次
        if total %4==0 and (total-1)%5==0:
            total = total//4*5+1
            count+=1
        else:
            count=0
            break
    if count==4:
#total是当前的数量,因此输出鱼数量total,而不输出num,num是上一个人的鱼数量
        print("鱼数量为:",total)
        break
    num+=1

3. 输入一个日期,判断该日期是当年的第N天。

例如:输入2022/12/31,这是当年的第365天;输入2020/12/31,这是当年的第366天。

方法1:

yearmonthday = input('enter yearmonthday:')
year =yearmonthday[0:4]
month = yearmonthday[5:7]
day = yearmonthday[8:10]
list31 = [1,3,5,7,8,10,12]
list30 = [4,6,9,11]
total =0
k = int(month)#注意本身自己的这个月不能算进去
day1 = int(day)
k-=1
if int(year)%400==0 or int(year)%4==0 and int(year)%100!=0:
    while k>0:
        if k in list31:
            total+=31
            k -= 1
        elif k in list30:
            total+=30
            k -= 1
        else:
            total+=29
            k -= 1
    print(f'{yearmonthday}{int(year)}的第{total+day1}天')
else:
    while k>0:
        if k in list31:
            total+=31
            k -= 1
        elif k in list30:
            total+=30
            k -= 1
        else:
            total+=28
            k -= 1
    print(f'{yearmonthday}{int(year)}的第{total+day1}天')

方法2:

  #方法2:
   #主要入手点看天数
   total = 0
   data = input("请输入日期(例:2020/12/31:):")
   datalist = data.split('/')
   year = int(datalist[0])
   days = int(datalist[2])
   if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:  # 闰年
       flag = 1
   else:
       flag = 0
   # 2、创建一个列表存储天数
   monthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
   # 3、先计算前n-1个月的总天数
   month = int(datalist[1])
   if flag and month > 2:
       total += sum(monthDays[:month - 1]) + 1
   else:
       total += sum(monthDays[:month - 1])
   sumday = total + days
   print(sumday)

输出结果:
在这里插入图片描述

习题如果遇到更好的解决方法我会再次写上去滴。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值