【Python】流程控制与字符串案例集锦

程序1:回文数

回文数:“回文”是指正读反读都能读通的句子
例:12321是回文数

num = input("请输入一个整数:") # 获取到一个str类型的整数
num1 = num[::-1] # 通过-1的步长将字符串翻转
if num==num1:
    print(num,"是回文数")
else:
    print("不是")

解题思路:

  • 通过字符串特性,将数值转成字符串类型,并将数值翻转 判断翻转后的数值与原本数值是否相同,
  • 如果相同说明是回文数

程序2-1:找出1000以内的所有阿姆斯特朗数(自幂数)

阿姆斯特朗数也叫自幂数:如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数
例如:1^1 = 1 或 1^3 + 5^3 + 3^3 = 153

100-999范围内的阿姆斯特朗数也叫水仙花数(只有3位数的阿姆斯特朗数才叫水仙花数)

for i in range(1,1001): # 获取1-1000的整数序列
    stri = str(i) # 把int类型转换为str类型
    length = len(stri) # 获取字符串长度,也就是数值有几位,获取到的值就是次方值
    allsum = 0 # 用于记录累加值
    for k in range(0,length): # 根据长度循环,可以获取当前数可取的下标值
        # 每次循环获取一个值并转为int后求幂,将幂运算结果累加到allsum上
        allsum = allsum + int(stri[k])**length
    if allsum==i: # 循环结束,得到当前数值的运算结果,判断结果与值本身是否相同
        print(i)

解题思路:

  • 数值的长度即有几位数就是几次方,字符串可以获取字符串数量
  • 字符串可以根据下标获取单个字符,下标的取值范围[0,字符串长度-1],所以可以使用字符串长度做循环,变量k分别就是字符串的下标
  • 通过下标获取到的数字是字符串类型,需要转为int后再做幂运算
  • 将获取到的每个数字幂运算结果累加,判断结果是否等于值本身

程序2-2:找出所有的水仙花数

也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数,水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身。
例如:1^1 = 1 或 1^3 + 5^3 + 3^3 = 153

for i in range(100,1000): # 获取100-999的整数序列
    stri = str(i) # 把int类型转换为str类型
    allsum = 0 # 用于记录累加值
    # 可以确定数字长度一定是3,所以循环和次方数可以直接确定为3
    for k in range(0,3): # 可以获取当前数可取的下标值
        # 每次循环获取一个值并转为int后求幂,将幂运算结果累加到allsum上
        allsum = allsum + int(stri[k])**3
    if allsum==i: # 循环结束,得到当前数值的运算结果,判断结果与值本身是否相同
        print(i)

程序3:找出1000以内的所有完数

一个数如果恰好等于除了它本身之外的因子之和,这个数就称为“完数”。
例如6=1+2+3

for i in range(1,1001): # 获取1-1000的整数序列
    allsum = 0 # 用于做数据累加
    for k in range(1,i): # 获取i寻找因子的范围(除了自己本身)
        if i%k==0: # 判断i是否能整除k,如果能整除说明k是i的因子
            allsum += k # 将因子累加起来
    if allsum == i: # 循环结束后,判断因子累加值是否与值本身相等
        print(i)

解题思路:

  • 能够整除的数就说明是因子,一个数只可能整除小于等于本身的数
  • 因为完数中因子总和不需要值本身,所以确定因子取值范围[1,i-1]
  • 判断i是否能整除k(i对k求余,余数为0说明能整除)
  • 将能被整除的k累加起来
  • 循环结束后,判断因子和是否等于值本身

程序4:找出1000以内的所有素数(质数)

素数(prime number)又称质数,有无限个。除了1和它本身以外不再被其他的除数整除,
例如1,2,3,5,7,11,13等

for i in range(1,1001): # 获取1-1000的整数序列,做质数判断
    for k in range(2,i): # 获取i寻找因子的范围(除了1和本身),循环获取因子,判断i是否能整除
        # 判断是否能做整除,如果能整除,说明当前数除了1和本身之外还能整除其它数,就不是质数
        if i % k ==0:
            break # 中断当前整除判断的循环,继续下一个数的质数判断
    else: # 循环正常结束会执行到else,如果循环被break中断不会执行else
        # 执行到else中的语句说明整除判断的循环没有执行过break,也就是没有符合判断条件的数
        # 说明当前数除了1和本身之外不能整除任何数
        print(i)

解题思路:

  • 能够整除的数就说明是因子,一个数只可能整除小于等于本身的数
  • 一个数一定能整除1和本身,所以确定取值范围为[2,i-1]
  • 判断i是否能整除k(i对k求余,余数为0说明能整除)
  • 如果能整除,说明该数除了1和本身还能整除其它数,所以不是质数,结束当前判断循环,继续下一个数的判断
  • 如果判断循环都已经结束了还没有能整除的数,说明该数就是质数
  • 提示:for循环中有else语句,else在循环正常结束时能被执行,但是当循环被break终止的情况不会执行else的内容

程序5:排列组合

有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

allsum = 0 # 用于做累加
for i in range(1,5): # 获取第一位数
    for m in range(1,5): # 获取第二位数
        for n in range(1,5): # 获取第三位数
            if i!=m and m!=n and i!=n: # 三位数之间两两互不相等,就是组合得到的数
                # 输出数据,因为i,m,n是int整数类型,需要做拼接
                # print(str(i)+str(m)+str(n)) # 把数据转为str后再做合并
                # print("%s%s%s"%(i,m,n)) # 使用占位符拼接
                # print("{}{}{}".format(i,m,n)) # 使用format做拼接
                print(i,m,n,sep="") # 使用print函数的多参数输出特性做展示的拼接
                allsum += 1 # 累加统计有几种组合方式
print("排列组合方式:",allsum,"种")

解题思路:

  • 因为要组成3位数,3位数的取值范围都是1-4
  • 嵌套3个循环,第一层循环获取第一位数,第二层循环获取第二位数,第三层循环获取第三位数
  • 获取到3个数后,两两对比是否相等,必须是3个值互不相等才可以
  • 第一层循环从1开始,先获取所有1开头的数字,然后再开始第二次的循环获取2开头的数字,所以只要值不同,每次获取到的值都不相同

程序6:数据加密

某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位放到第三位,第二位放到第一位,第三位放到第四位,第四位放到第二位。

'''
方法1. 数据值小的情况下,可以直接获取每位数,直接操作
'''
num = input("请输入一个4位数的整数:") # str类型
a,b,c,d = num[0],num[1],num[2],num[3] # str类型
a,b,c,d = int(a), int(b), int(c), int(d) # str类型转成int类型
a,b,c,d = (a+5)%10,(b+5)%10,(c+5)%10,(d+5)%10 # 根据加密规则1计算后替换数据
print(b,d,a,c,sep="") # 根据加密规则2替换数据位置

'''
方法2. 把加密规则处理放到一起
'''
num = input("请输入一个4位数的整数:") # str类型
# 把加密处理合并到一起处理
a,b,c,d = (int(num[0])+5)%10,(int(num[1])+5)%10,(int(num[2])+5)%10,(int(num[3])+5)%10
print(b,d,a,c,sep="") # 根据加密规则2替换数据位置

'''
方法3. 数据值大的情况下,尽量选择使用循环做每位数的处理
'''
num = input("请输入一个4位数的整数:") # str类型
strnum = "" # 用于记录字符的拼接
for i in range(len(num)): # 循环分别获取每位数
    n = (int(num[i])+5)%10 # 根据加密规则1计算数据
    strnum = strnum + str(n) # 将计算后的数据拼接起来
# 根据加密规则2替换数据位置
print(strnum[1],strnum[3],strnum[0],strnum[2],sep="")

解题思路:

  • 让用户输入一个4位数,注意:默认获取到的是str类型
  • 通过下标分别获取个十百千,四位数,当前这4位数也是str类型
  • 将个十百千分别转成int后,在该数基础上+5再%10
  • 因为分别获取的个十百千位,所以一定是1位数,1位数+5最大是14,最小是5,所以这个数%10结果也是1位数
  • 因为当前数字是int类型,无法做拼接,所以将int转为str类型后,根据交换要求把对应的值放在对应的位置,使用+做字符串的合并操作得到最终结果

程序7:数据解密

根据上一题的加密规则,破解加密数据。

num = input("请输入需要解密的数据:") # str类型
# 先把数据换回原本的位置
num = "%s%s%s%s"%(num[2],num[0],num[3],num[1])
strnum = "" # 用于记录拼接每个值
# 根据加密规则反向计算原本的值
for i in range(len(num)):
    n = int(num[i])
    if n < 5: # 符合条件的数据是加密时%10把十位数的1去除了,所以需要把10加回来
        n = n+10
    result = n-5 # n还原到%10之前的数据,统一-5就可以还原到原本的数据
    strnum = strnum + str(result) # 把得到的原本的数据拼接起来
print(strnum)

解题思路:

  • 让用户输入一个需要解密的4位数,注意:input获取到的数据是str类型
    在这里插入图片描述
  • 分别获取需要解密的4位数,这4位数分别是原数+5%10的余数结果,当余数<5,说明这为数原本是2位数,因为%10把前面的1去除了,所以还原时,需要把10加上再根据加密规则-5;如果余数>=5说明原本的值就是1位数,只需要根据加密规则-5就可以
  • 根据交换要求再交换位置即可

程序8:最大公因数

公约数是指能同时整除几个整数的数。如果一个整数同时是几个整数的约数,称这个整数为它们的“公约数”。计算两个数的最大公约数。

num1 = int(input("请输入一个整数:"))
num2 = int(input("请再输入一个整数:"))
# 公约数的取值范围一定小于等于两个数中小的那个数
minnum = min(num1,num2) # 获取两个数中最小的那个数
while True:
    # 如果两个数都能整数的数就是公约数,从最大的可能数开始找,第一个公约数就是最大公约数
    if num1%minnum==0 and num2%minnum==0:
        break
    else:
        minnum -= 1 # 如果当前数不是公约数,继续往小一位数判断
print(minnum)

解题思路:

  • 让用户输入2个值
  • 公约数一定小于等于两个数之间最小的值,所以公约数的取值范围从两个之间的最小值开始,逐渐往下-1
  • 第一个能同时被用户输入的两个值整除的就是最大公约数

程序9:最小公倍数

公倍数是指在两个或两个以上的自然数中,如果它们有相同的倍数,这些倍数就是它们的公倍数。计算两个数的最小公倍数。

num1 = int(input("请输入一个整数:"))
num2 = int(input("请再输入一个整数:"))
# 公倍数一定大于等于两个数中最大的那个数
maxnum = max(num1,num2) # 获取两个数中大的那个数
while True:
    # 如果当前数能同时整除两个数,说明这个数就是这两个说的公倍数
    # 从最小取值开始判断,第一个公倍数就是最小公倍数
    if maxnum%num1==0 and maxnum%num2==0:
        break
    else:
        maxnum+=1 # 如果当前值不是公倍数,再往上一位数判断
print(maxnum)

解题思路:

  • 让用户输入2个值
  • 公倍数一定大于等于两个数之间最大的值,所以公倍数的取值范围从两个之间的最大值开始,逐渐往上+1
  • 第一个能整除用户输入的两个值的数就是最小公倍数

程序10:猴子分桃

海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?

num = 6 # 至少6个桃子才够第一只猴子丢一个平均分五份
while True:
    x = num # 第一只猴子看到的桃子数就是总数
    for i in range(5): # 循环5次,也就是分别5只猴子执行同样的操作
        if (x-1)%5==0: # 判断当前桃子数是否能被丢一个平均分成5份
            x = x-1-((x-1)//5) # 当前桃子数=(之前的桃子数)-1-(上一只猴子拿走的数量)
        else:# 桃子数不满足让猴子丢一个平均分五份
            num += 1 # 总桃子数+1,结束当前循环,继续从第一只猴子开始判断新总数是否符合条件
            break # 中止for循环
    else: # for循环正常结束,也就是5只猴子都能分均分配桃子
        print(num)
        break # 中止while循环

解题思路:

  • 桃子不会少于10个,所以数量可以从10开始定义
  • 一共5只猴子,每个猴子的操作都是一样的,先扔掉一个桃子,然后才能平均分成5分也就是:(x-1)%5==0
  • 第一只猴子分完之后拿走一份,也就是第二只猴子看到的桃子数量是:x = x-1-((x-1)//5)
  • 第三只猴子看到的数量是在第二只猴子看到的基础上-1-第二只猴子拿走的数量
  • 第五只猴子能正常丢一个分成5分就可以结束循环,得到最终的桃子数

最终结果:
第1只猴子: 当前桃子数:3121 拿走的数量:(3121-1)/5=624
第2只猴子: 当前桃子数:2496 拿走的数量:(2496-1)/5=499
第3只猴子: 当前桃子数:1996 拿走的数量:(1996-1)/5=399
第4只猴子: 当前桃子数:1596 拿走的数量:(1596-1)/5=319
第5只猴子: 当前桃子数:1276 拿走的数量:(1276-1)/5=255

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhouwhui椆

这是一个你请我恰饭的机会呀!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值