python经典算法100例子,python3.6版本

这篇博客介绍了Python中的冒泡排序算法,通过具体例子展示了冒泡排序的过程,并给出了详细的代码实现。此外,还讲解了如何使用Python输出9*9的乘法口诀表,包括两种不同的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 【程序1】
# # 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
#程序分析:组成所有的排列,然后去除不满足条件的排列。使用count计数,将每次的循环排列的结果放在list列表中,最后统一打印出来
count=0
list=[]
for a in range(1,5):
    for b in range(1,5):
        for c in range(1,5):
            if(a!=b) and (b!=c)and(c!=a):
                count=count+1
                list.append(a+b*10+c*100)
print("总数是",count)
print("可以组成的不重复数据是:",list)
print(len(list))

 

# 例2:题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;
# 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;
# 20万到40万之间时,高于20万元的部分,可提成5%;
# 40万到60万之间时高于40万元的部分, 可提成3%;
# 60万到100万之间时,高于60万元的部分,可提成1.5%,
# 高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
#方法一.使用if 以及while,使用  try   except捕获错误,若输入字符非数字,会把错误抛出来,
isYoN='Y'
while isYoN=='Y':
    try:
        profit=float(input("请输入当月利润(单位万元):"))
    except ValueError as e:
        print("报错,输入值非数字:",e)
    print(type(profit))
    if profit<=10:
        bonus=0.1*profit
    elif 10<profit<=20:
        bonus=10*0.1+(profit-10)*0.075
    elif 20<profit<=40:
        bonus=10*0.1+10*0.075+(profit-20)*0.05
    elif 40<profit<=60:
        bonus=10*0.1+10*0.075+20*0.05+(profit-40)*0.03
    elif 60<profit<=100:
        bonus=10*0.1+10*0.075+20*0.05+20*0.03+(profit-60)*0.015
    elif profit>100:
        bonus=10*0.1+10*0.075+20*0.05+20*0.03+40*0.015+(profit-100)*0.01
    else:
        print("输入有误,导致计算错误")
    print("经计算核对,应发奖金总数为:%f万元"%(bonus))
    isYoN=input("是否选择继续计算奖金(Y/N):")
#方法二 使用数组完成,数据必须倒序,从大到小这样排列
profit_list=[100,60,40,20,10,0]
bonus_list=[0.01,0.015,0.03,0.05,0.075,0.1]
# bonus_list=[0.1,0.075,0.05,0.03,0.015,0.01]
# profit_list=[0,10,20,40,60,100]
print(len(profit_list))
print(len(bonus_list))
bonus=0
print(type(profit_list[1]))
profit=float(input("请输入当月利润(单位万元):"))
for i in range(0,6):
    if profit>profit_list[i]:
        bonus=bonus+(profit-profit_list[i])*bonus_list[i]
        profit=profit_list[i] ###这一步存在的意义,自己体会,这个就是神之一手
print("最终核对奖金是:",bonus)
#3.题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
#写法一:
for i in range(1,10000):
    for j in range(10,100000):
        if(i*i-100==j*j-100-168):
            print("完全平方数是:%s 和 %s"%(i,j))
            print("该数的值是:",i*i-100)
#写法二:
# for i in range(1,85):
#     if 168 % i == 0:
#         j = 168 / i;
#         if  i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0 :
#             m = (i + j) / 2
#             n = (i - j) / 2
#             x = n * n - 100
#             print(x)

 

#4.输入某月某日,判断这一天是一年的第几天?
# 方法一:解题思路;月份+当天日期数,相当于嵌套循环,先看几月份,然后再看根据月份 循环遍历,把所有的天数相加,嵌套循环
import calendar
days=[31,28,31,30,31,30,31,31,30,31,30,31]
year=int(input("请输入年:"))
month=int(input("请输入月:"))
day=int(input("请输入日:"))
numday=0
for i in range(1,13):
    if i==month:
        for j in range(0,i-1):
            numday = days[j]+numday
if ((((year%4==0) and (year%100!=0))or year%400==0)and month>2):
    numday=numday+1
print(numday+day)
#方法二 直接调用 datetime
import datetime
year=int(input("请输入年:"))
month=int(input("请输入月:"))
day=int(input("请输入日:"))
numdays=datetime.date(year,month,day)
result=numdays - datetime.date(numdays.year - 1 ,12, 31)##把去年的最后一天作为基数,然后输入的日期减去基数就等于 增加的天数
print(numdays,result)

 

#5.题目:输入三个整数x,y,z,请把这三个数由小到大输出。
#方法一:直接使用sort函数
list=[]
num=input("请输入三个数字,并用逗号隔开:") ##s输入字符串
list=num.split(',') # 使用逗号字符串分割
xlist=[]
for i in range(0,len(list)):
    xlist.append(int(list[i]))
print(sorted(xlist))##从小到打排列
print(sorted(xlist,reverse=True))####从大到小排列
#方法二 冒泡排序法
list=[]
num=input("请输入三个整数,并用逗号隔开:")
list=num.split(',')
xlist=[]
for i in range(0,len(list)):
    xlist.append(int(list[i]))
for i in range(0,len(xlist)):
    for j in range(0,len(xlist)-i-1):
        if xlist[j]>xlist[j+1]:
            xlist[j],xlist[j+1]=xlist[j+1],xlist[j]
print(xlist)

要学习冒泡排序必须知道它的原理:

冒泡排序算法的原理如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

例子

1,2,3,4,5,6

就拿1到6来举例子吧!这里面有n个数字,你要对其进行从大到小的排序的话,你就要拿相邻的两个数进行比较,如果第一个数比第二个大就交换他们的位置:第二个就和第三个比较,一直这样下去,直到最小的就会在最后面了,然后继续从第一和第二个进行比较,如此下去。

第1轮: 1,2,3,4,5,6   2,1,3,4,5,6     2,3,1,4,5,6    2,3,4,1,5,6    2,3,4,5,1,6    2,3,4,5,6,1

第2轮:2,3,4,5,6,1   3,2,4,5,6,1     3,4,2,5,6,1    3,4,5,2,6,1    3,4,5,6,2,1 

第3轮:3,4,5,6,2,1   4,3,5,6,2,1     4,5,3,6,2,1    4,5,6,3,2,1  

第4轮:4,5,6,3,2,1   5,4,6,3,2,1     5,6,4,3,2,1  

第5轮:5,6,4,3,2,1  6,5,4,3,2,1

由上面可以清楚了解到一个进行了五轮排序,后一轮都要比前一轮少一次比较,第一轮进行n-1次比较

这样就可以编写代码了

a_list = [1, 2, 3, 4, 5, 6]

for t in range(len(a_list)-1):

    for i in range(0, len(a_list)-1):
        tmp = a_list[i]
        if a_list[i] < a_list[i+1]:
            a_list[i] = a_list[i+1]
            a_list[i+1] =tmp

print(a_list)
# 6.题目:斐波那契数列。
程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。
def fib(n):
    if n==1 or n==2:
        return 1
    if n>2:
        return fib(n-1)+fib(n-2)
#输出前10个斐波那契数列
list=[]
for i in range(1,11):
    list.append(fib(i))
print(list)
# flag='Y'
# n=1
# list=[]
# while flag=='Y':
#     testfib = fib(n)
#     list.append(testfib)
#     print(testfib)
#     print(list)
#     flag=input("请选择是否继续(Y/N):")
#     n=int(input("请输入n的值:"))
#     if flag=='N':
#         break
# 7.题目:将一个列表的数据复制到另一个列表中。
# 程序分析:使用列表[:]。
#方法一:使用列表的[:]
a=[1,2,3,4,6,77]
b=a[:]
a.append("heheb")
print("a是:",a)
print("b是:",b)
#方法二 挨个读取a列表,append到 b中
a=[1,2,3,4,6,77]
b=[]
for i in range(0,len(a)):
    b.append(a[i])
a.append("heheb")
print("a是:",a)
print("b是:",b)
#方法三 使用copy
a=[1,2,3,4,6,77]
b=a.copy()
a.append("heheb")
print("a是:",a)
print("b是:",b)
#方法四 使用extend
a=[1,2,3,4,6,77]
b=[]
b.extend(a)
a.append("heheb")
print("a是:",a)
print("b是:",b)

#8.题目:输出 9*9 乘法口诀表。
#程序分析:分行与列考虑,共9行9列,i控制行,j控制列。反正都会用到循环嵌套
for i in range(1,10):#一共有9行
for j in range(1,i+1):#对应的每个i行 ,需要有1至i个数与i相乘,
print(j,"*",i,"=",j*i,end="")# end=""的使用方法就是 让输出可以不用换行
if j!=i:
print(" , ",end="")###最后一个 不用打印出逗号
print("\n")##每一个 i行结束 需要开启新的i行,则换行输出
#方法二 放在一个数组里
a=[1,2,3,4,5,6,7,8,9]
for i in range(len(a)):#控制行数
    for j in range(i+1):#因为i是从0开始的,所以需要加一
        print("%d*%d="%(a[j],a[i]),a[j]*a[i],end=" | ")
    print(" ")#换行

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值