python 100 道题的部分答案以及原题,想练手的可以看看

本文分享了Python编程的100道题目中部分难题的解答,涵盖基础到进阶,适合想要提升Python技能的程序员进行实战练习。
摘要由CSDN通过智能技术生成
'''
古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到
第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
n =int(input("第几个月:"))
斐波拉且数列

month=input("请输入月份:")
if month.isdigit():
    month=int(month)
    a=0
    b=1
    for i in range(month-1):
        a,b=b,a+b
    print("%d月份以后兔子有%d对"%(month,b))
else:
    print("输入有误请重新输入")

'''

'''
判断 101-200 之间有多少个素数,并输出所有素数。
素数的概念:质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数
分析:


list = []
for i in range(100):
    list.append(101+i)
for i in range(101,201):      #除数为 101-200 这200个数字
    for j in range(2,i):      #除数为从2至i本身的前一个数字
        if i%j == 0:          #如果能除尽
            list.remove(i)    #则从 lst 列表剔除
            break
print(list)                   #剩下的都是素数
'''
'''
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立
方和等于该数本身。例如:153 是一个“水仙花数”,因为 153=1 的三次方+5 的三次方
+3 的三次方。
1,这个数在1000内,是个三位数即
a*100+b*10+c=a*a*a+b*b*b+c*c*c
考察for循环的运用


for a in range(1,11):
    for b in range(1,11):
        for c in range(1,11):
            if a*100+b*10+c == a*a*a+b*b*b+c*c*c:
                n = a * 100 + b * 10 + c
                print(n)
'''
'''
题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。 
分析:
上述判断方法,明显存在效率极低的问题。对于每个数n,其实并不需要
从2判断到n-1,我们知道,一个数若可以进行因数分解,那么分解时得到
的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上
述代码中并不需要遍历到n-1,遍历到sqrt(n)即可,因为若sqrt(n)左
侧找不到约数,那么右侧也一定找不到约数。

# 了解学习一下sys.stdout
from sys import stdout
n = int(input("请输入一个正整数: "))
for i in range(2,n+1):
    while n != i:
        if n % i ==0:
            stdout.write(str(i))
            stdout.write("*")
            n = n / i
        else:
           break
print("%d" % n)

n = num = int(input('请输入一个数字:'))  # 用num保留初始值
f = []  # 存放质因数的列表

for j in range(int(num / 2) + 1):  # 判断次数仅需该数字的一半多1次
    for i in range(2, n):
        t = n % i  # i不能是n本身
        if t == 0:  # 若能整除
            f.append(i)  # 则表示i是质因数
            n = n // i  # 除以质因数后的n重新进入判断,注意应用两个除号,使n保持整数
            break  # 找到1个质因数后马上break,防止非质数却可以整除的数字进入质因数列表

if len(f) == 0:  # 若一个质因数也没有
    print('该数字没有任何质因数。')
else:  # 若至少有一个质因数
    f.append(n)  # 此时n已被某个质因数整除过,最后一个n也是其中一个质因数
    f.sort()  # 排下序
    print('%d=%d' % (num, f[0]), end='')
    for i in range(1, len(f)):
        print('*%d' % f[i], end='')
from  math import sqrt
while 1:
    n = int(input('请输入一个整数:'))
    print('%d='%n,end='')
    while n>1:
        for i in range(2,int(sqrt(n)+1)):
            if n%i==0:
                n=int(n/i)
                if n==1:
                    print('%d'%i,end='')
                else:
                    print('%d*'%i,end='')
                break
print()
'''


'''
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 

str = input('请输入字符串:')
dic = { 'letters' :0,'numbers':0,'spaces':0,'others':0}
for i in str:
    if i.isalpha():
        dic['letters'] += 1
    elif i.isdigit():
        dic['numbers'] += 1
    elif i.isspace():
        dic['spaces'] += 1
    else:
        dic['others'] += 1
print(dic)

InPut = input('请输入字符串:')
letters  = [ ]
spaces = [ ]
digits   = [ ]
others = [ ]
for i in iter(InPut):
    if i.isalpha():
        letters.append(i)
    elif i.isspace():
        spaces.append(i)
    elif i.isdigit():
        digits.append(i)
    else:
        others.append(i)
print('
字母: {}, 个数: {}
空格: {}, 个数: {}
数字: {}, 个数: {}
其他: {}, 个数: {}'\
.format(letters, len(letters), spaces, len(spaces), digits, len(digits),others, len(others)))

'''

'''
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如 6=1+2+3。编
程找出 1000 以内的所有完数。 


from functools import reduce
def sum(a,b):
    return a+b
for i in range(2,1001):
    l = [1]
    for j in range(2,int((i/2)+1)):
        if i%j ==0:
            l.append(j)  # 找到因数就增加到l表
        if i == reduce(sum,l):
            print(i)
            print(l)
'''
'''
题目:一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在
第 10 次落地时,共经过多少米?第 10 次反弹多高? 
该数列是等比数列,即求等比数列和他的和

H = 100
n = int(input("请输入次数:"))
def f(n):
    h = (1/2)**n * H  #注,数的n次方的表达方式
    s = H *(1-(1/2)**n)
    return h,s
print(f(n))

'''

'''
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃
了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一
天剩下的一半多一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘
了多少。
这题得倒着推。第10天还没吃,就剩1个,说明第9天吃完一半再吃1个还剩1个,假设第
9天还没吃之前有桃子p个,可得:p * 1/2 - 1 = 1,可得 p = 4。以此类推,即可手
算出。

代码思路为:第10天还没吃之前的桃子数量初始化 p = 1,之后从9至1循环9次,根据上
述公式反推为 p = (p+1) * 2 可得第1天还没吃之前的桃子数量。
考察循环和反向思维

p = 1
print('第10天吃之前就剩1个桃子')
for i in range(9,0,-1): #倒着循环
    p = (p+1)*2
    print('第%s天吃之前还有%s个桃子' % (i, p))
print('第1天共摘了%s个桃子' % p)

'''


'''
两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已
抽签决定比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比,
请编程序找出三队赛手的名单。 
'''

# import  java
# for(char i ='x';i<='z';i++){
#     for(char j ='x';j<='z';j++){
#         if(i!=j)//这里放一个判断,比赛队员不能重复比赛,判断写在外面又可以减少循环次数
#             for(char k = 'x';k<='z';k++){
#                 if(i!=k&&j!=k)//同上,排除相同
#                     if(i!='x'&&k!='x'&&k!='z')//这里根据题意排除掉不符合的名单
#                         System.out.println("a和"+i+"\n"+"b和"+j+"\n"+"c和"+k+"\n");
#             }
#     }
# }

# str1 = ['a','b','c']
# str2 = ['x','y','z']
# n = 0
# for n in range(1,3):
#
#     print("a和" + i + "\n" + "b和" + j + "\n" + "c和" + k + "\n")
#         # if i != j:
#         #     for k in str1:
#         #         if i != k and j != k:
#         #             if i != 'x' and  k != 'x' and k != 'z':
#         #                 print("a和"+i+"\n"+"b和"+j+"\n"+"c和"+k+"\n")

# 没有写出来

'''
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项
之和。 


n = int(input("请输入项数:"))
fenzi = 2
fenmu = 1
l = []
s = 0
for n in range(1,n+1):
    a = fenzi
    b = fenmu
    s +=  (a/b)
    l.append('%s%s'%(a,b))
    fenzi = a + b
    fenmu = a

print('+'.join(str(i) for i in l), end='')
print('=%.2f' % s)
'''

'''
题目:求 1+2!+3!+...+20!的和 
每一项为:n! = n+n-1+....2+1 = (1/2)*(n+1)*n(该分析错误)
n!是指自然数n的阶乘,即:n!=1*2*3…(n-2)*(n-1)*n
每一项为: n! = n*(n-1)*(n-2).....*2*1


n = int(input("请输入项数:"))
s = 0
for i in range(1,n+1):
    a = (1/2)*(i+1)*i
    s += a
    print(s)


n = int(input("请输入项数:"))
f = 1
s = 0
for i in range(1,n+1):
    f = f * i  #递归
    s += f
print(s)
'''

'''
题目:利用递归方法求 5!

#方法一
n = int(input("请输入项数:"))
f = 1
for i in  range(1,n+1):
    f = f*i  # 递归
print(f)

#方法二
import functools
print(functools.reduce(lambda x,y:x*y, range(1,6)))

#方法三
import functools, operator
print(functools.reduce(operator.mul, range(1,6)))

'''
'''
题目:利用递归函数调用方式,将所输入的 5 个字符,以相反顺序打印出来。 
# 没法解释:一句代码写了三步,高手和生手的区别,
str  = input("请输入字符:")

def f(x):
    if x == -1:  # 当变量的长度是-1时,返回
        return ''
    else:  # 否则返回字符串的位置向后移1位,直到变量的长度为-1
        return str[x] + f(x - 1)
print(f(len(str) - 1))




#自己写的普通版
str = input("请输入字符:")
n = len(str)
l = []
for i in range(n):
    f = str[-i-1]
    l.append(f)
    print(l)
'''

'''
题目:有 5 个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁
数,他说比第 3 个人大 2 岁。问第三个人,又说比第 2 人大两岁。问第 2 个人,说比第
一个人大两岁。最后问第一个人,他说是 10 岁。请问第五个人多大? 

分析:
这个题和猴子吃桃一样,得反着来算,第一个人比第二个人小两岁,第二个人比第三个人小两岁
第二个人得年龄是:P-2 =10 ,p = 10 + 2


n = int(input("请输入多少个人:"))
p = 10
for i in range(1,n):
    p = p + 2
    print(p)
'''


'''
题目:给一个不多于 5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数
字。 

str = input("请输入不多于5位的正整数:")
if int(str) >= 100000:
    print("你输入的数大于5位整数!")
else:
    print(len(str))
    for i in range(len(str)):
        f = str[-i-1]
        print(f)
'''



'''
题目:一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位
与千位相同。 

for n in range(10000,100000):
    if str(n)[0] == str(n)[4] and str(n)[1] == str(n)[3]:
        print(n)

str = input("请输入数字:")
def huiwen(n):
    if len(n) != 5:
        print("输入的数字不是5位数!")
    else:
        if n[0] == n[4] and n[1] == n[3]:
            print("该数字是回文数")
print(str)

str1 = input("请输入数字:")

def huiwen2(str):
    if str.isdigit():
        if len(str) < 3:
            print("该数字不是回文数!")
        else:
            flag = True
            for i in range(len(str)):
                if str[i] != str[-i-1]:
                    flag = False
            return  flag
    else:
        return  '你输入有误'
print(huiwen2(str1))

'''



'''
题目:将一个数组逆序输出。 

str = input("请输入一个数组:")
# 递归
def f(x):

    if x == -1:  # 当变量的长度是-1时,返回
        return ''
    else:  # 否则返回字符串的位置向后移1位,直到变量的长度为-1
        return str[x] + f(x - 1)

print(f(len(str) - 1))


# 原创
str = input("请输入一个数组:")
l = []
for i in range(len(str)):
    t = str[-i-1]
    l.append(t)
print(l)
'''

'''
题目:求 100 之内的素数 

l = [ i for i in range(2,100)]
for i in range(3,100):
    for j in range(2,i):
        if i%j == 0:
            l.remove(i)
            break
print(l)

'''

'''
题目:对 10 个数进行排序 


# 冒泡排序
def bubble_sort(str):
    for i in range(len(str)):  # 这个循环负责设置冒泡排序进行的次数
        for j in range(len(str)-1): # j为列表下标
            if str[j] > str[j+1]:
                str[j],str[j+1] = str[j+1],str[j]  # 相邻交换大小
    return str
str = [22,34,12,4,78,23,15,11,9,52]
print(bubble_sort(str))


# 快速排序
def quik_sort(str):
    if len(str) < 2:  # 基线条件(停止递归的条件)
        return str
    else:    # 递归条件
        baseValue = str[0]   # 选择基准值
        less ,greater,equal = [],[],[baseValue]
        for i in range(1,len(str)):
            if str[i] > baseValue:
                greater.append(str[i])
                # 由所有大于基准值的元素组成的子数组
            elif str[i] < baseValue:
                less.append(str[i])
                # 由所有小于基准值的元素组成的子数组
            else:
                equal.append(str[i])
                # 包括基准在内的同时和基准相等的元素,在上一个版本的百科当中,并没有考虑相等元素
        return quik_sort(less) + quik_sort(equal) + quik_sort(greater)
str1 = [22,34,12,4,78,23,15,11,9,52]
print(quik_sort(str1))
'''


'''
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。



n = input("请输入一个数:")
str = [4, 9, 11, 12, 15, 22, 23, 34, 52, 78]
def insert_sort(n,str):
    if n.isdigit():
        baseValue = int(n)
        less, greater, equal = [], [], [baseValue]
        for i in range(len(str)):
            if int(str[i]) > baseValue:
                greater.append(str[i])
            elif int(str[i]) < baseValue:
                less.append(str[i])
            else:
                equal.append(str[i])
        return less + equal + greater
    else:
        return "你输入不是数字!"
print(insert_sort(n,str))

'''
'''
题目:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3
的人退出圈子,问最后留下的是原来第几号的那位。 

n = int(input("请输入人数:"))
p = [i for i in range(1,n+1)]
def f(n):
    for i in range(1,n+1):
        if i%3 == 0:
            p.remove(i)
    return p
print(f(n))
'''
'''
题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m
个数 
分析:n>m
最后m个数为 str[m-1,len(n)-1]
最前的为str[:m-1]

n = [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20]
m = int(input("请输入后移位置:"))
def f(m):
    l1 = n[m-1:len(n)-1]
    l2 = n[:m-1]
    return l1+l2
print(f(m))

'''
'''
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。



n = [22,34,12,4,78,23,15,11,9,52]
n2 = sorted(n)
n[0] = n2[len(n)-1]
n[len(n)-1]=n2[0]
print(n)

def f(n):
    n[0],n[len(n)-1] = sorted(n)[len(n)-1],sorted(n)[0]
    return n
n = [22,34,12,4,78,23,15,11,9,52]
print(f(n))
'''

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

设总共的桃子有x个
第一只猴子分:x /5多了一个,还剩(x-1)*4/5=x2
第二只猴子分:x2/5多了一个,还剩(x2-1)*4/5=x3
第三只猴子分:x3/5多了一个,还剩(x3-1)*4/5=x4
第四只猴子分:x4/5多了一个,还剩(x4-1)*4/5=x5
第五只猴子分:x5/5多了一个,还剩(x5-1)*4/5=x6

即:第五只分,还剩:n=(((((((((x-1)*4/5)-1)*4/5)-1)*4/5)-1)*4/5)-1)*4/5>=1
且,第剩下四只猴子可以均分:n%4 == 0


for x in range(1,10000):
    for n in range(1,1000):
        n = (((((((((int(x) - 1) * 4 / 5) - 1) * 4 / 5) - 1) * 4 / 5) - 1) * 4 / 5) - 1) * 4 / 5
        if n%4 == 0:
            print(x)
        else:
            break





#!/bin/python
# -*- coding: UTF -8 -*-
i=0 #执行次数
j=1	#最后猴子拿到的桃子数
x=0	#每次均分后,第一只猴子拿了之后剩下的总数
while i<5:
        x=4*j;
        for i in range(0,5):
                if (x%4!=0):
                        break
                else:
                    i = i + 1
                x=(x/4)*5+1
        j+=1
print(int(x))
#


'''

'''
假设第二个猴子拿了 x2 个桃子,第三个猴子拿了 x3 个,那么有这么个关系: 4 x2 = 5 x3 + 1 ,
这是类似于 4 a = 5 b + 1 的式子。毫无疑问的是 a 、b 都是整数了。4 a = 5 b + 1 = 4 b + (b + 1),
那么可想而知 b + 1 = 4 k,于是有:

a = 5 k - 1  b = 4 k - 1

因为 (x1, x2), (x2, x3), (x3, x4),(x4, x5) 均满足类似于 4 a = 5 b + 1 的式子,
也自然满足上面的 a, b 关系。假设对应的 k 分别是k1  k2  k3  k4,根据 x2 = 4 k1 - 1 = 5 k2 - 1 ,
可以得出 k1 : k2 = 5 : 4,所以会有 :

k1 : k2 = 5 : 4  k2 : k3 = 5 : 4  k3 : k4 = 5 : 4

k1  k2  k3  k4 均是整数,所以不难找到最小的 k1 是 5×5×5,当然可以加任意倍数。
那么的出来的桃子总数应该是 z = 5 x1+1 = 5 (5 k1 - 1) + 1 = 3125 k - 4 ,(k ∈ N)

'''


# times = 1
# for x in range(1,1000):
#     def f(x,times):
#         if times<4 :
#             return f(x*5+1,times)
#             times += 1
#         if times == 4:
#             return x * 5 + 1
#
#     print(f(x ,times))
#
# i = 0  # 执行次数
# 最后猴子拿到的桃子数
# x = 0  # 每次均分后,第一只猴子拿了之后剩下的总数

# def f(x,i):
#     j = 1
#     x = 4 * j
#     if i < 5 : #开始递归
#         for i in range(5):
#             if (x % 4 != 0):
#                 break
#             else:
#                 i += 1
#                 j += 1
#                 x = (x / 4) * 5 + 1
#         return f(x,i)
#     else:
#         return x
#
# print(f(1 ,0))
# 没有写出来


'''
题目:有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母
顺序排列),输出到一个新文件 C 中。 
'''

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值