python1001无标题_python100刷题 11-20

这周继续11-20的题目,希望自己能好好坚持

古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

# 兔子的规律为数列1,1,2,3,5,8,13,21.... 答案参考斐波拉契数。更改题目,将3个月改成可定义的参数

# by_nico

def feb_n(x,n):

if x < n:

return 1

else:

return feb_n(x-1,n)+feb_n(x-(n-1),n) #注意理解这里

feb_n(9,5)

判断101-200之间有多少个素数,并输出所有素数。

# 分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

# by_nico

for i in range(101,201):

for j in range(2,int(np.sqrt(i))+1):

if i % j ==0:

break

else:

print(i)

# 网上解法 可以用filter进行过滤

打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

# 1. by_nico 两个代码主要是获取3个数的方式不一样

for i in range(100,1000):

a = i//100

b = (i-a*100)//10

c = i-a*100-b*10

sum = a**3+b**3+c**3

if i == sum:

print(i)

# 2. by_nico 转换为字符串后进行索引

for i in range(100,1000):

sum_m = 0

for j in [0,1,2]:

sum_a = int(str(i)[j])**3

sum_m += sum_a

if i == sum_m:

print(i)

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

# 1. by_nico,从除数2开始不断除2,直到不能再除2,再开始除3~

def resolve_num(x):

dd = x

num = []

for i in range(2,x+1):

while x%i == 0:

num.append(str(i))

x = x//i

continue

print("{}={}".format(dd,'*'.join(num)))

resolve_num(467)

# 2. 网上其他解法,每次被除数更改后从2开始继续除

n = int(input('Please input a number:'))

n1=n

l=[]

while n>1:

for i in range(2,n+1):

if n%i==0:

n=n//i # 这里如果写成x= x/i,那么i会变成float类型,下次for循环会报错

l.append(str(i))

break # 跳出后进入外层的while循环

print('%d=' %n1 + '*'.join(l))

# 补充:都传入参数:1324431200。分别计时两个函数,发现我的函数运行了58999.1140毫秒,第二个解法只用了0.2229毫秒。OMG,赶快找原因,原来是我没有判断被除数>1,导致for循环运行了1324431200次。然后做了如下修改,修改后0.2162毫秒。看来考虑问题还不够细致~

def resolve_num(x):

dd = x

num = []

for i in range(2,x):

while x%i == 0:

num.append(str(i))

x = x//i

if x >1:

continue # 如果被出示大于1,就继续判断下一个除数

else:

break # 如果被除数小于1,就跳出循环,输出分解结果

print("{}={}".format(dd,'*'.join(num)))

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

# by_nico

score = float(input('请输入分数:'))

if score >= 90:

print("A")

elif score >= 60:

print("B")

else:

print("C")

import time.time

print(time.time()) #1498539133.655

print(time.localtime()) #tm_year=2017, tm_mon=6, tm_mday=27, tm_hour=12, tm_min=53, tm_sec=16, tm_wday=1, tm_yday=178, tm_isdst=0

print(time.strftime('%Y-%m-%d %X',time.localtime())) #'2017-06-27 13:00:57'

import datetime

print(datetime.date.today()) #datetime.date(2017, 6, 27)

print(datetime.datetime.now()) #2020-05-20 11:07:55.081084

print datetime.date.today().strftime('%d/%m/%Y') #'27/06/2017'

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

# 1.by_nico 使用for循环结合正则进行判断

import re

str_ = input('请输入一行字符:')

a,b,c,d = [0,0,0,0]

for i in str_:

if re.match('[a-zA-Z]',i):

a+=1

elif re.match('\d',i):

b+=1

elif re.match('\s',i):

c+=1

else:

d+=1

print('字母共计{}个,数字共计{}个,空格共计{}个,其他共计{}个'.format(a,b,c,d))

# 2.其他解法,使用while循环和字符串方法

s = input('请输入一个字符串:\n')

letters = 0

space = 0

digit = 0

others = 0

i=0

while i < len(s):

c = s[i]

i += 1

if c.isalpha(): # 判断是否字母

letters += 1

elif c.isspace(): # 判断是否空格

space += 1

elif c.isdigit(): #判断是否数字

digit += 1

else:

others += 1

print('char = %d,space = %d,digit = %d,others = %d' % (letters,space,digit,others))

求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

# 1.by_nico,生成'aaaa'字符串再转成int格式

a = input('请制定一个数字(1-9):')

n = int(input('请指定相加次数:'))

sum_n= 0

for i in range(1,n+1):

aa = int(a*i)

sum_n+=aa

print(sum_n)

# 2.网上其他解法

n = int(input('n = '))

a = int(input('a = '))

sum = 0

total = 0

for i in range(n):

sum += (10 ** i)

total += sum * a

print(total)

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

# 1.by_nico 把他除自身外能整除的数相加等于自身。

for i in range(1,1001):

list_num = []

summ_m = 0

for j in range(1,i):

if i % j ==0:

list_num.append(str(j))

summ_m +=j

if summ_m == i:

print('{}={}'.format(i,'+'.join(list_num)))

# 结果

6=1+2+3

28=1+2+4+7+14

496=1+2+4+8+16+31+62+124+248

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

# 1.by_nico

def func(h,n):

sum_m = 100

for i in range(1,n+1):

if i > 1: # 加这个判断,避免n=1时出错

sum_m += h

h = h/2

print('第{}次落地时经过{}米'.format(n,sum_m))

print('第{}次反弹高{}米'.format(n,h/2))

func(100,10)

# 结果

第10次落地时经过299.609375米

第10次反弹高0.09765625米

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值