python个人练习(20-29)

10

#20.判断某年某天

#输入

import datetime


def dijitian():
    year, month, day = map(int, input("请依次输入(年 月 日):").split(" "))
    yuandan = datetime.datetime(year, 1, 1)
    now = datetime.datetime(year, month, day)
    print(f"是{year}年的第{(now-yuandan).days + 1}天")


while True:
    try:
        dijitian()
    except ValueError:
        print("请按正确格式输入有效的数!")

#输出

# 请依次输入(年 月 日):123
# 请按正确格式输入有效的数!
# 请依次输入(年 月 日):,
# 请按正确格式输入有效的数!
# 请依次输入(年 月 日):2025 6 9
# 是2025年的第160天
# 请依次输入(年 月 日):2011 2 28
# 是2011年的第59天
# 请依次输入(年 月 日):2024 2 30
# 请按正确格式输入有效的数!

#21.斐波那契数列(递归,O(2^n))

#输入

import time


def feibo(n):
    if n == 1 or n == 2:
        return 1
    else:
        return feibo(n-2) + feibo(n-1)


while True:
    try:
        n = int(input("请输入一个正整数:"))
        if n <= 0:
            print("输入不是正整数,请重新输入!")
            continue
        start_time = time.time()
        print(f"第{n}个斐波那契数是:{feibo(n)},", end="")
        end_time = time.time()
        print(f"计算用时{end_time-start_time:.5f}s")
    except ValueError:
        print("请输入有效的数!")

#输出

# 请输入一个正整数:0
# 输入不是正整数,请重新输入!
# 请输入一个正整数:1
# 第1个斐波那契数是:1,计算用时0.00002s
# 请输入一个正整数:10
# 第10个斐波那契数是:55,计算用时0.00004s
# 请输入一个正整数:30
# 第30个斐波那契数是:832040,计算用时0.05721s
# 请输入一个正整数:40
# 第40个斐波那契数是:102334155,计算用时6.80852s
# 请输入一个正整数:,
# 请输入有效的数!

#21.斐波那契数列(非递归)

#输入

import time


def feibo(n):
    feibos = [1, 1]
    for i in range(2, n+1):
        feibos.append(feibos[i-1]+feibos[i-2])
    return feibos[n-1]


while True:
    try:
        n = int(input("请输入一个正整数:"))
        if n <= 0:
            print("输入不是正整数,请重新输入!")
            continue
        start_time = time.time()
        print(f"第{n}个斐波那契数是:{feibo(n)},", end="")
        end_time = time.time()
        print(f"计算用时{end_time-start_time:.5f}s")
    except ValueError:
        print("请输入有效的数!")

#输出

# 请输入一个正整数:0
# 输入不是正整数,请重新输入!
# 请输入一个正整数:1
# 第1个斐波那契数是:1,计算用时0.00003s
# 请输入一个正整数:2
# 第2个斐波那契数是:1,计算用时0.00003s
# 请输入一个正整数:33
# 第33个斐波那契数是:3524578,计算用时0.00004s
# 请输入一个正整数:40
# 第40个斐波那契数是:102334155,计算用时0.00003s
# 请输入一个正整数:,
# 请输入有效的数!
# 请输入一个正整数:-10
# 输入不是正整数,请重新输入!

#22.复制列表

#输入

import copy

List = [1, 2, 3, 4]
List1 = List
List2 = copy.copy(List)
List[0] = 30
print(List)
print(List1)
print(List2)

#输出

# [30, 2, 3, 4]
# [30, 2, 3, 4]
# [1, 2, 3, 4]

#23.暂停后输出

#输入

import time

start_time = time.time()
time.sleep(5)
end_time = time.time()
print(f"计算用时{end_time-start_time:.5f}s")

#输出

#计算用时5.00011s

#24.成绩if语句

#输入

while True:
    try:
        score = int(input("请输入成绩(百分制):"))
        if score > 100 or score < 0:
            print("成绩不在0-100范围内,请重新输入!")
            continue
        elif score >= 90:
            print("A")
        elif score >= 60:
            print("B")
        else:
            print("C")
    except ValueError:
        print("请输入有效的数!")

#输出

# 请输入成绩(百分制):99
# A
# 请输入成绩(百分制):100
# A
# 请输入成绩(百分制):101
# 成绩不在0-100范围内,请重新输入!
# 请输入成绩(百分制):-1.2
# 请输入有效的数!
# 请输入成绩(百分制):87
# B
# 请输入成绩(百分制):43
# C

#25.统计字符

#输入

import string
import time


str1 = input("请输入一串字符串:")
start_time = time.time()
print(f"总长度为{len(str1)}")
alpha = num = space = symbol = 0
for i in str1:
    if i.isalpha():
        alpha += 1
    elif i.isnumeric():
        num += 1
    elif i == " ":
        space += 1
    else:
        symbol += 1
print(f"字母数量为{alpha}")
print(f"数字数量为{num}")
print(f"空格数量为{space}")
print(f"空格数量为{symbol}")
end_time = time.time()
print(f"程序用时{end_time-start_time:.5f}s")

#输出

# 请输入一串字符串:asd 3294 AFDA3ga ,.weie[]
# 总长度为25
# 字母数量为13
# 数字数量为5
# 空格数量为3
# 空格数量为4
# 程序用时0.00032s

#26.落体反弹问题

#输入

h = 100
List = []
n = 0
while n < 10:
    if n == 0:
        List.append(h)
        h /= 2
        n += 1
    else:
        List.append(h*2)
        h /= 2
        n += 1
print(List)
print(f"第{n}次落地反弹{List[n-1]/2}米")
print(f"在第{n}次落地时,共经过{sum(List)}米")

#输出

# [100, 100.0, 50.0, 25.0, 12.5, 6.25, 3.125, 1.5625, 0.78125, 0.390625]
# 第10次落地反弹0.1953125米
# 在第10次落地时,共经过299.609375米

#27.猴子吃桃问题

#输入

n = 1
List = []
for i in range(1, 11):
    if i == 1:
        List.append(n)
    else:
        n = (n+1)*2
        List.append(n)
print(List)
print(f"第一天早上有{List[9]}个桃子")

#输出

# [1, 4, 10, 22, 46, 94, 190, 382, 766, 1534]
# 第一天早上有1534个桃子

#28求指定序列的和

#输入

sum = 0
up = 2
down = 1
List = []
for i in range(20):
    List.append(up/down)
    sum += up/down
    a = up
    up += down
    down = a
print([f"{num:.3f}" for num in List])
print(sum)

#输出

# ['2.000', '1.500', '1.667', '1.600', '1.625', '1.615', '1.619', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618', '1.618']
# 32.66026079864164

#29.求各个阶乘的和

#输入

import math
total = 0
List = []
for i in range(1, 21):
    List.append(math.factorial(i))
    total += math.factorial(i)
print(len(List))
print(sum(List))
print(f"1-20的阶乘之和是{total}")

#输出

# 20
# 2561327494111820313
# 1-20的阶乘之和是2561327494111820313