python基础必练题!!

水仙花数

python 复制代码
水仙花数
info = 3
while info:
    # 用户输入数字
    try:
        print(f"请输入数字,您有{info}次机会!!")
        num = int(input("请输入100-999的数字:"))
        if num<100 or num>999:
            info -= 1
            print(f"请输入合法数字!!!您还有{info}次机会!!")
            continue
        b = num //100 # 取百位
        s = num //10%10  # 取十位
        g = num % 10  # 取个位
        if b**3+s**3+g**3 == num:
            print(f"{num}:这个数是水仙花数")
            break
        else:
            print(f"{num}:这个数不是水仙花数")
            info -= 1
    except:
        print(f"请输入数字!!!您还有{info}次机会!!")
        info -= 1

插入排序

python 复制代码
插入排序
# 定义列表
nums  = [87,38,77,2,33,98,73,22,12]
for i in range(len(nums)):
    # 判断 <右边的元素> 是否小于 <左边元素>
    # 如果 小于,则将两个元素交换位置,就变成"小在左,大在右了"
    while nums[i] < nums[i-1] and i>=1:
        nums[i],nums[i-1] = nums[i-1],nums[i]
        i -= 1

冒泡排序

python 复制代码
冒泡排序
# 定义列表
nums  = [87,99,17,2,33,68,73,22,12]
# 遍历的次数是列表长度 减一
# 相当于要冒泡几轮
for i in range(len(nums)-1):
    # 每轮冒泡的次数, 
    # -i 是因为 :上轮将大的数已经排在后面,所以后面的就不再参与
    for j in range(len(nums)-1-i):
        if nums[j] > nums[j+1] :
            # 比较左边 'nums[j]' 和右边 'nums[j+1]' 的元素 换位
            nums[j],nums[j+1] = nums[j+1],nums[j]
print(nums)

百鸡百钱

python 复制代码
百鸡百钱
题干:公5,母3,小1/3
公鸡x  母鸡y  小鸡z  加起来要 100 只
5x+3y+z/3=100
---------------------------------------
count = 0
for x in range(1,20):
    # 因为公鸡数量不会超过20
    for y in range(1,33):
    # 母鸡数量不超过33
        # 小鸡的数量
        z = 100 - x - y
        if z != 0 and 5*x+3*y+z/3 == 100:
            count += 1 # 每次方法记录加一
            print(f"第{count}种方法:{x}只公鸡,{y}只母鸡,{z}只小鸡")

最小公倍数

python 复制代码
最小公倍数

num1 = int(input("请输入数字1:"))
num2 = int(input("请输入数字2:"))
if num1 < num2 :
    num1,num2 = num2,num1
else:
    num1,num2 = num1,num2
for i in range(num1,num1*num2+1):
    if i%num1==0 and i%num2==0:
        print(f"{i}是{num1}和{num2}的最小公倍数")

二分查找

首要条件:被查询的序列,必须是有序的。

target : 目标

python 复制代码
target = n
left = 0  # 左下标/索引
right = len(lis)-1  # 右下标/索引
while left <= right:
    # 找到列表中间索引
    mid = (left+right)//2 
    if lis[mid] > target:
        # 如果中间值大于目标值,说明目标值在中间值左边
        # 所以需要修改右下标。
        right = mid-1  
    elif lis[mid] < target:
        # 如果中间值小于目标值,说明目标值在中间值右边
        # 所以需要修改左下标。
        left = mid + 1
    else:
        print(f"该数字的下标为{mid}")
        break
else:
	print("该目标不在序列中......")

猜年龄-妹妹几岁了

小明带两个妹妹参加元宵灯会。别人问她们多大了,他们调皮地说:"我们两个的年龄之积是年龄之和的六倍。"小明又补充说:"他们可不是双胞胎,年龄差也不超过8岁。"请写出,较小妹妹的年龄?

复制代码
实现思路:
	1、两个妹妹不是双胞胎,年纪肯定不一样
	2、年龄积是年龄和的六倍
python 复制代码
for i in range(1,100):  # 假设姐姐的年龄
    for j in range(1,i):  # 假设妹妹的年龄
        if i*j==6*(i+j) and i-j<8:  # 姐妹年龄的条件
            print(f"姐姐{i}岁了,妹妹{j}岁了")

求好字符串?

复制代码
题干需求:
    长度为三且各字符不同的子字符串
    如果一个字符串不含有任何重复字符,我们称这个字符串为好字符串。
    给你-一个字符串s, 请你返回s中长度为3的好子字符串的数量。
    注意,如果相同的好子字符串出现多次,每一次都应该被记入答案之中。
    子字符串是一个字符串中连续的字符序列。
python 复制代码
str_i = input("请输入3位以上的字符:")
counts = 0
for i in range(len(str_i)-2):  # 以防下方索引时超出范围
    if str_i[i] != str_i[i+1] and str_i[i] != str_i[i+2] and str_i[i+1] != str_i[i+2]:
        counts += 1
        print(f"好字符有:{str_i[i]}{str_i[i+1]}{str_i[i+2]}")
print(f"一共有{counts}个好字符")

阶乘为n

复制代码
需求:
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。
比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 
输入:1 输出:[1,2,3,4,5,6,7,8,9] 
python 复制代码
n = int(input('请输入n:'))
for i in range(1,10 ** n):
    print(i)

穷举算法

复制代码
案例要求:1、2、3、4能组成多少个互不相同且无重复数字的三位数,
各是多少?并统计个数
python 复制代码
counts = 0
for g in range(1,5):
    for s in range(1,5):
        for b in range(1, 5):
            if g != s and g != b and s != b:
                counts += 1
                print(100 * b + 10 * s + g)

print(f"一共{counts}个")

斐波那契数列

python 复制代码
def fun2(n):
    """斐波那契数列 求第n项的值"""
    if n == 1 or n == 2:
        return 1
    else:
        return fun2(n-1) + fun2(n-2)
fun2(7)

用户登录

复制代码
需求实现:
	使用input分别输入用户名和密码,验证登录过程
        (1)从终端输入用户名,保存到username中。
        (2)从终端输入密码,保存到password中。
        (3)【核心功能】判断username等于"admin"且password等于"123"的判断结果,如果结果为真,则输出"用户名和密码正确,登陆成功"。
        (4)【核心功能】判断username不等于"admin"、password不等于"123"中至少有一个为假的结果,如果结果为真,则输出用户名或密码有误,登陆失败"。
        (5)【核心功能】正确使用while循环,登录不成功支持循环登录,最多不超过3次;如果超过3次,则提示"登陆失败,请稍候重试"。
python 复制代码
counts = 3  # 计数
while counts:
    username = input("请输入用户名:")  # 用户
    password = input("请输入密码:")  # 密码
    if username == "admin" and password == "123":  # 判断
        print("用户名、密码输入正确,登陆成功!")
        break
    else:
        counts -= 1  # 计数减一
        print("用户名或密码有误,登陆失败。")
        print(f"您还有{counts}次机会")
else:
    print("登录失败,请稍后重试。")

九九乘法表

复制代码
使用 while 和 for 分别实现"九九乘法表"。
python 复制代码
# while
i = 1
while i <= 9:
    j = 1
    while j<=i:
        print(f"{j}*{i}={j*i}",end="\t")
        j += 1
    print()
    i += 1

# for
for i in range(1, 10):  # 行
    for j in range(1, i + 1):  # 列
        print(f"{i}*{j}={i * j}", end='\t')
    print()

1-10之间的奇偶数

复制代码
需求:
	输出'1-10'之间的奇数。
python 复制代码
for i in range(1,11):
    if i % 2 != 0 :  # 判断
        print(i)

元宝胖多少?

复制代码
小岭家有只布偶猫名叫元宝,吃的特别多,
假设今天元宝胖了0.1斤,
以后每天胖的重量都是前一天的2倍,
y = 2 * x
明天 = 2 * 今天
问10天后元宝胖了多少斤?
python 复制代码
startNum = 0.1
for i in range(9):
    startNum *= 2
print(startNum)

维纳的年龄

复制代码
美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。
一次,他参加某个重要的会议,年轻的脸孔引人注目。有人询问他的年龄,他回答说:"
	我的年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了0-9这10个数字,每个都恰好出现一次。
"
请你推算一下,他当时到底有多年轻。
python 复制代码
# 前置条件:年轻、年龄立方是个4位数、年龄4次方是个6位数
for i in range(11,30):
    num1 = str(i**3)
    num2 = str(i**4)
    if len(num1)==4 and len(num2)==6:
        if len(set(num1+num2)) == 10:
            print(f"他的年龄是{i}。\n数字是{num1+num2}")

大衍数列

复制代码
中国古代文献中,曾记载过"大衍数列",主要用于解释中国传统文化中的太极衍生原理。
它的前几项是0、2、4、8、12、18、24、32、40、50...其规律是对偶数项,是序号平方再除2,奇数项,是序号平方减1再除2。
python 复制代码
for i in range(1,101):
    if i%2==0:
        # 偶数
        print(int((i**2)/2))
    else:
        print(int((i**2-1)/2))