'''
古典问题:有一对兔子,从出生后第 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 中。
'''