习题:
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)
输出结果:
习题如果遇到更好的解决方法我会再次写上去滴。