原链接:https://blog.csdn.net/weixin_41084236/article/details/81564963
原菜鸟教程:https://www.runoob.com/python/python-100-examples.html
题目 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
#anan
num = [1, 2, 3, 4]
for i in num:
for j in num:
if j != i:
for k in num:
if k != i and k != j:
print("%d " %(i*100 + j*10 + k), end="")
安安笔记
1.range
Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
Python3 list() 函数是对象迭代器,可以把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。
Python2 range() 函数返回的是列表
>>> range(1, 5)
range(1, 5)
>>> list(range(5))
[0, 1, 2, 3, 4]
2.combinations和permutations返回的是对象地址,原因是在python3里面,
返回值已经不再是list,而是iterators(迭代器),
所以想要使用,只用将iterator 转换成list 即可,
还有其他一些函数返回的也是一个对象,需要list转换,比如 list(map())等 。
********** 原博客 *********
程序分析 遍历全部可能,把有重复的剃掉。
total=0
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if ((i!=j)and(j!=k)and(k!=i)):
print(i,j,k)
total+=1
print(total)
简便方法 用itertools中的permutations即可。
import itertools
sum2=0
a=[1,2,3,4]
for i in itertools.permutations(a,3):
print(i)
sum2+=1
print(sum2)
题目 企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?
#anan
bonus_10_max = 10*0.1
bonus_20_max = 10*0.1 + (20-10)*0.075
bonus_40_max = 10*0.1 + (20-10)*0.075 + (40-20)*0.05
bonus_60_max = 10*0.1 + (20-10)*0.075 + (40-20)*0.05 + (60-40)*0.03
bonus_100_max = 10*0.1 + (20-10)*0.075 + (40-20)*0.05 + (60-40)*0.03 + (100-60)*0.015
profit = float(input("Please input profit(以万元为单位): "))
if profit <= 10:
bonus = profit*0.1
elif 10 < profit <= 20:
bonus = bonus_10_max + (profit-10)*0.075
elif 20 < profit <= 40:
bonus = bonus_20_max + (profit-20)*0.05
elif 40 < profit <= 60:
bonus = bonus_40_max + (profit-40)*0.03
elif 60 < profit <= 100:
bonus = bonus_60_max + (profit-60)*0.015
else:
bonus = bonus_100_max + (profit-100)*0.01
print(bonus)
上面的那个真的是太傻了
借鉴了一下原博客的写法,对自己的代码进行了改进
#anan_improve
thresholds = [100000, 200000, 400000, 600000, 1000000]
rate = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
profit = float(input("Please input profit: "))
bonus = 0
#for i in len(thresholds): TypeError: 'int' object is not iterable
for i in range(len(thresholds)):
if profit <= thresholds[i]:
bonus += (profit-thresholds[i-1])*rate[i]
else:
bonus += thresholds[i]*rate[i]
print(bonus)
安安笔记
上面错误形象表示:不能直接写for i in 5 要写成for i in range(5)
********** 原博客 *********
程序分析 分区间计算即可。
profit=int(input('Show me the money: '))
bonus=0
thresholds=[100000,100000,200000,200000,400000]
rates=[0.1,0.075,0.05,0.03,0.015,0.01]
for i in range(len(thresholds)):
if profit<=thresholds[i]:
bonus+=profit*rates[i]
profit=0
break
else:
bonus+=thresholds[i]*rates[i]
profit-=thresholds[i]
bonus+=profit*rates[-1]
print(bonus)
题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
(注意注意)自己下面的这个应该写的不对,之前理解题意有问题,读者需自行斟酌
#anan
import math
#判断一个数是不是整数 和小数相比较
def isInteger(num):
num = num*1.0
s = str(num).split(".")
if s[1] == "0":
return True
else:
return False
num = 0
while True:
if isInteger(math.sqrt(num+100)) and isInteger(math.sqrt(num+268)):
break
else:
num += 1
print(num)
安安笔记
1.完全平方数是这样一种数:它可以写成一个正整数的平方。例如,36是6×6,49是7×7。
2.Python isdigit() 方法检测字符串是否只由数字组成。
3.不用那么麻烦导入math模块
求x的平方根:x ** 0.5
求x的平方:x ** 2
4.python 判断一个数是整数还是小数
另一种方法:int(num) == num
将这个数转换为整数,看看是否与原数相等
#别人
a=81**0.5
s=str(a).split('.')
if float(s[1])==0:
print('整数')
else :print('小数')
#anan
#判断一个数是不是整数 和小数相比较
def isInteger(num):
num = num*1.0
print(type(num))
s = str(num).split(".")
print(s)
if s[1] == "0":
return True
else:
return False
print(isInteger(2.0))
print(isInteger(2.1))
print(isInteger(2))
-------
<class 'float'>
['2', '0']
True
<class 'float'>
['2', '1']
False
<class 'float'>
['2', '0']
True
********** 原博客 *********
程序分析 因为168对于指数爆炸来说实在太小了,所以可以直接省略数学分析,用最朴素的方法来获取上限:
n=0
while (n+1)**2-n*n<=168:
n+=1
print(n+1)
----------
85
思路是:最坏的结果是n的平方与(n+1)的平方刚好差168,由于是平方的关系,不可能存在比这更大的间隙。
至于判断是否是完全平方数,最简单的方法是:平方根的值小数为0即可。
结合起来:
n=0
while (n+1)**2-n*n<=168:
n+=1
for i in range((n+1)**2):
if i**0.5==int(i**0.5) and (i+168)**0.5==int((i+168)**0.5):
print(i-100)
题目 输入某年某月某日,判断这一天是这一年的第几天?
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.17
#题目 输入某年某月某日,判断这一天是这一年的第几天?
def isLeapYear(year):
year = int(year)
if (year%400 == 0 or (year%100 != 0 and year%4 == 0)) :
return True
else:
return False
#date格式:1998.10.10
def dayNumber(date):
month_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
days_per_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
tmp = date.split(".")
year = int(tmp[0])
month = int(tmp[1])
day = int(tmp[2])
day_number = 0
# print(tmp)
# print(year, month, day)
for i in range(len(month_list)):
if month > month_list[i]:
day_number += days_per_month[i]
else:
day_number += day
break
if isLeapYear(year) and month > 2:
day_number += 1
return day_number
print(dayNumber("2000.3.2")) #62
print(dayNumber("1998.10.10")) #283
安安笔记
1 month_list其实可以不用写
2.原博客写的很简洁 直接用month来生成range(month)
3.代码优化:
#优化前
def isLeapYear(year):
year = int(year)
if (year%400 == 0 or (year%100 != 0 and year%4 == 0)) :
return True
else:
return False
#优化后
def isLeapYear(y):
return (y%400==0 or (y%4==0 and y%100!=0))
********** 原博客 *********
程序分析 特殊情况,闰年时需考虑二月多加一天:
def isLeapYear(y):
return (y%400==0 or (y%4==0 and y%100!=0))
DofM=[0,31,28,31,30,31,30,31,31,30,31,30]
res=0
year=int(input('Year:'))
month=int(input('Month:'))
day=int(input('day:'))
if isLeapYear(year):
DofM[2]+=1
for i in range(month):
res+=DofM[i]
print(res+day)
题目 输入三个整数x,y,z,请把这三个数由小到大输出。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.17
#题目 输入三个整数x,y,z,请把这三个数由小到大输出。
n = int(input("请输入要比较的整数的个数:"))
print("请输入要比较的整数:")
num = []
for i in range(n):
num.append(int(input()))
print(num)
num.sort()
print(num)
安安笔记
1.x=int(input('int%d: '%(i)))
2.print(sorted(raw2)) raw2是一个列表
raw2 = []
for i in range(3):
x=int(input('int%d: '%(i)))
raw2.append(x)
---------
int0: 3
int1: 5
int2: 1
********** 原博客 *********
程序分析 练练手就随便找个排序算法实现一下,偷懒就直接调函数。
raw=[]
for i in range(3):
x=int(input('int%d: '%(i)))
raw.append(x)
for i in range(len(raw)):
for j in range(i,len(raw)):
if raw[i]>raw[j]:
raw[i],raw[j]=raw[j],raw[i]
print(raw)
raw2=[]
for i in range(3):
x=int(input('int%d: '%(i)))
raw2.append(x)
print(sorted(raw2))
题目 斐波那契数列。
安安笔记
1.list1 = [1, 2, 3, 4, 5]
list1[0:2] 包含0, 不包含2
def Fib(n):
return 1 if n<=2 else Fib(n-1)+Fib(n-2)
********** 原博客 *********
程序分析 斐波那契数列(Fibonacci sequence),从1,1开始,后面每一项等于前面两项之和。图方便就递归实现,图性能就用循环。
# 递归实现
def Fib(n):
return 1 if n<=2 else Fib(n-1)+Fib(n-2)
print(Fib(int(input())))
# 朴素实现
target=int(input())
res=0
a,b=1,1
for i in range(target-1):
a,b=b,a+b
print(a)
题目 将一个列表的数据复制到另一个列表中。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.17
#题目 将一个列表的数据复制到另一个列表中。
list1 = [1, 3, 2, 6, 8, 4]
list2 = list1
print(list2)
安安笔记
1 正所谓,无知者无畏,自己觉得这个题好简单,出题人就是个傻子,原来有这么多知识在里面呀,受教了,受教了
copy仅拷贝对象本身,而不对其中的子对象进行拷贝,故对子对象进行修改也会随着修改。(例如下面的:[1,2,3, [2,3],4] 其中[2,3] 就是子对象)
deepcopy是真正意义上的复制,即重新开辟一片空间。我们经常说的复制实际上就是deepcopy.(深拷贝之后的对象是不受原对象的影响,无论原对象发生什么修改,深拷贝的对象都不会发生改变)
********** 原博客 *********
程序分析 使用列表[:],拿不准可以调用copy模块。
import copy
a = [1,2,3,4,['a','b']]
b = a # 赋值
c = a[:] # 浅拷贝
d = copy.copy(a) # 浅拷贝
e = copy.deepcopy(a) # 深拷贝
a.append(5)
a[4].append('c')
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
print('e=',e)
============ RESTART: F:\PyWorkspace\Python100\100examples\007.py ============
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b= [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c= [1, 2, 3, 4, ['a', 'b', 'c']]
d= [1, 2, 3, 4, ['a', 'b', 'c']]
e= [1, 2, 3, 4, ['a', 'b']]
题目 输出 9*9 乘法口诀表。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.17
#题目 输出 9*9 乘法口诀表。
for i in range(1, 10):
for j in range(1, i+1):
print("%dx%d=%-2d " %(j, i, i*j), end='')
#print("\n") #有间隔
print("") #无间隔
#print() #无间隔
--------
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
----------
1x1=1
1x2=2 2x2=4
1x3=3 2x3=6 3x3=9
1x4=4 2x4=8 3x4=12 4x4=16
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81
print()默认会输出回车
#print("\n") #有间隔
print("") #无间隔
#print() #无间隔
********** 原博客 *********
程序分析 分行与列考虑,共9行9列,i控制行,j控制列。
for i in range(1,10):
for j in range(1,i+1):
print('%d*%d=%2ld '%(i,j,i*j),end='')
print()
题目 暂停一秒输出。
几个时间函数的讲解,可点击此处进行了解
********** 原博客 *********
程序分析 使用 time 模块的 sleep() 函数。
import time
for i in range(4):
print(str(int(time.time()))[-2:])
time.sleep(1)
题目 暂停一秒输出,并格式化当前时间。
********** 原博客 *********
程序分析 同009.
import time
for i in range(4):
print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
time.sleep(1)
题目 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.20
#初始化
month_1 = 1
month_2 = 0
month_old = 0
month = 12
for i in range(month):
total = month_1 + month_2 + month_old
print("第%2d个月的兔子:month_1=%5d, month_2=%5d, month_old=%5d, total=%5d" %(i+1, month_1, month_2, month_old, total))
month_old = month_old + month_2
month_2 = month_1
month_1 = month_old
********** 原博客 *********
程序分析 我认为原文的解法有点扯,没有考虑3个月成熟的问题,人家还是婴儿怎么生孩子?考虑到三个月成熟,可以构建四个数据,其中:一月兔每个月长大成为二月兔,二月兔变三月兔,三月兔变成年兔,成年兔(包括新成熟的三月兔)生等量的一月兔。
month=int(input('繁殖几个月?: '))
month_1=1
month_2=0
month_3=0
month_elder=0
for i in range(month):
month_1,month_2,month_3,month_elder=month_elder+month_3,month_1,month_2,month_elder+month_3
print('第%d个月共'%(i+1),month_1+month_2+month_3+month_elder,'对兔子')
print('其中1月兔:',month_1)
print('其中2月兔:',month_2)
print('其中3月兔:',month_3)
print('其中成年兔:',month_elder)
********** 原菜鸟教程 *********
原菜鸟教程第11题
#!/usr/bin/python
# -*- coding: UTF-8 -*-
f1 = 1
f2 = 1
for i in range(1,22):
print '%12ld %12ld' % (f1,f2),
if (i % 3) == 0:
print ''
f1 = f1 + f2
f2 = f1 + f2
题目 判断101-200之间有多少个素数,并输出所有素数。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.20
#题目 判断101-200之间有多少个素数,并输出所有素数。
sum = 0
flag = 1 #素数 prime number
prime = []
num_begin = 101
num_end = 200
def isPrimeNumber(num):
for i in range(2, int(num**0.5)+1):
if num%i == 0:
return False
return True
for i in range(num_begin, num_end+1):
if isPrimeNumber(i):
sum += 1
prime.append(i)
print("素数的总数为:%d" %sum)
print(prime)
------
素数的总数为:21
[101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
********** 原博客 *********
程序分析 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 用else可以进一步简化代码.
import math
for i in range(100,200):
flag=0
for j in range(2,round(math.sqrt(i))+1):
if i%j==0:
flag=1
break
if flag:
continue
print(i)
print('\nSimplify the code with "else"\n')
for i in range(100,200):
for j in range(2,round(math.sqrt(i))+1):
if i%j==0:
break
else:
print(i)
题目 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.20
#题目 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
def isDaffodilNumber(num):
return num == (num//100%10)**3 + (num//10%10)**3 + (num//1%10)**3
for i in range(100, 1000):
if isDaffodilNumber(i):
print("%d " % i, end="")
# 153 370 371 407
安安笔记
原博客中作者的思路很好,将数字先转化成字符串,抽取其中的位数,再转化回来
********** 原博客 *********
程序分析 利用for循环控制100-999个数,每个数分解出个位,十位,百位。
for i in range(100,1000):
s=str(i)
one=int(s[-1])
ten=int(s[-2])
hun=int(s[-3])
if i == one**3+ten**3+hun**3:
print(i)
********** 原菜鸟教程 *********
for n in range(100,1000):
i = n / 100
j = n / 10 % 10
k = n % 10
if n == i ** 3 + j ** 3 + k ** 3:
print n
经过下面验证, 菜鸟教程这种方法是不可行的
>>> 123 / 10
12.3
>>> 123 / 10 % 10
2.3000000000000007
>>> 123 //10
12
>>> 123 // 10 % 10
2
题目 将一个整数分解质因数。例如:输入90,打印出90=233*5。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.20
#题目 将一个整数分解质因数。例如:输入90,打印出90=233*5
def isPrimeNumber(num):
for i in range(2, int(num**0.5)+1):
if num%i == 0:
return False
return True
def printFormat(num, *prime_list):
print("%d = " % num, end="")
for i in range(len(prime_list)):
print("%d" % prime[i], end="")
if i != (len(prime_list) - 1):
#print(i)
print("*", end="")
num = int(input("请输入一个整数:"))
prime = []
tmp = num
while True:
for i in range(2, int(num**0.5)+1):
if tmp%i == 0:
prime.append(i)
if isPrimeNumber(tmp/i):
prime.append(int(tmp/i))
tmp = int(tmp/i)
break
if isPrimeNumber(tmp):
break
printFormat(num, *prime)
安安笔记
1.python之列表作为函数的参数
def get_sum(*args):
res = 0
for i in args:
res += i
print(res)
lista = [1, 2, 3]
get_sum(*lista)
print('-' * 40)
#get_sum(*lista) 解包列表
********** 原博客 *********
程序分析 根本不需要判断是否是质数,从2开始向数本身遍历,能整除的肯定是最小的质数。
target=int(input('输入一个整数:'))
print(target,'= ',end='')
if target<0:
target=abs(target)
print('-1*',end='')
flag=0
if target<=1:
print(target)
flag=1
while True:
if flag:
break
for i in range(2,int(target+1)):
if target%i==0:
print("%d"%i,end='')
if target==i:
flag=1
break
print('*',end='')
target/=i
break
题目 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
********** 原博客 *********
程序分析 用条件判断即可。
points=int(input('输入分数:'))
if points>=90:
grade='A'
elif points<60:
grade='C'
else:
grade='B'
print(grade)
题目 输出指定格式的日期。
********** 原博客 *********
程序分析 使用 datetime 模块。
import datetime
print(datetime.date.today())
print(datetime.date(2333,2,3))
print(datetime.date.today().strftime('%d/%m/%Y'))
day=datetime.date(1111,2,3)
day=day.replace(year=day.year+22)
print(day)
题目 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
********** 原博客 *********
程序分析 利用 while 或 for 语句,条件为输入的字符不为 ‘\n’。
string=input("输入字符串:")
alp=0
num=0
spa=0
oth=0
for i in range(len(string)):
if string[i].isspace():
spa+=1
elif string[i].isdigit():
num+=1
elif string[i].isalpha():
alp+=1
else:
oth+=1
print('space: ',spa)
print('digit: ',num)
print('alpha: ',alp)
print('other: ',oth)
安安笔记
1.表示方法
string[i].isspace()
string[i].isdigit()
题目 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.20
#题目 求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。
a = input("请输入要相加的基数:")
count = int(input("请输入要相加的次数:"))
sum = 0
for i in range(count):
a_new = a*(i+1)
sum += int(a_new)
print(sum)
原博客:用了a += a[0] 我用的是* 效果是一样的
********** 原博客 *********
程序分析 用字符串解决。
a=input('被加数字:')
n=int(input('加几次?:'))
res=0
for i in range(n):
res+=int(a)
a+=a[0]
print('结果是:',res)
题目 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.20
#题目 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
# 基本释义:指整数a除以整数b(b≠0) 的商正好是整数而没有余数,b是a的因数。
# 例句:若a是b的因数,且a是质数,则称a是b的质因数。
# 扩展资料:
# 在小学数学里,两个正整数相乘,那么这两个数都叫做积的因数,或称为约数。假如a*b=c(a、b、c都是整数),那么就称a和b就是c的因数。需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成立。 反过来称c为a、b的倍数。
# 因子不包括数本身 因数包括
# 如10的因子是1,2,5 因数是1,2,5,10
# 完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。
def isPerfectNumber(num):
divisor = [1] #存放数num所有的因子
sum = 0
if num == 1:
return False
for i in range(2, int(num**0.5)+1):
if num%i == 0:
divisor.append(i)
divisor.append(int(num/i))
#print(divisor)
for i in range(len(divisor)):
sum += divisor[i]
return num == sum
for i in range(10000):
if isPerfectNumber(i):
print(i)
********** 原博客 *********
程序分析 将每一对因子加进集合,在这个过程中已经自动去重。最后的结果要求不计算其本身。
def factor(num):
target=int(num)
res=set()
for i in range(1,num):
if num%i==0:
res.add(i)
res.add(num/i)
return res
for i in range(2,1001):
if i==sum(factor(i))-i:
print(i)
题目 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.20
#题目 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
height = 100
total = 100
for i in range(10):
print("总高度:%.4f " % total, end="")
height /= 2
total += height*2
print("第%2d次反弹的高度:%.4f " %(i+1, height))
安安笔记
1.学习format格式化
print(‘总高度:tour = {0}’.format(sum(tour)))
题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.22
#题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
total = [0,0,0,0,0,0,0,0,0,1]
left = [0,0,0,0,0,0,0,0,0]
for i in range(8, -1, -1):
#print(i, end=" ")
left[i] = total[i+1]
total[i] = (left[i]+1)*2
print(total)
print(left)
# [1534, 766, 382, 190, 94, 46, 22, 10, 4, 1]
# [766, 382, 190, 94, 46, 22, 10, 4, 1]
安安笔记
1.range(5,0,-1) 5,4,3,2,1
range(4,-1,-1) 4,3,2,1,0
题目 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
自己是按照当时C语言中的思路来做的,但是python中有一个神奇的东西,叫做集合,可以删除重合的数据,见原博客
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.22
#题目 两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
team = ["x", "y", "z"]
for i in team:
for j in team:
if j != i:
for k in team:
if k!=i and k!=j:
if i=="x" or k=="x" or k=="z":
continue
print(i,j,k)
a = set(["x", "y", "z"])
b = set(["x", "y", "z"])
c = set(["x", "y", "z"])
for i in a:
for j in b:
for k in c:
if len(set([i, j, k])) == 3:
print(i, j, k)
# x z y
# x y z
# z x y
# z y x
# y x z
# y z x
********** 原博客 *********
程序分析 找到条件下不重复的三个对手即可。
a=set(['x','y','z'])
b=set(['x','y','z'])
c=set(['x','y','z'])
c-=set(('x','z'))
a-=set('x')
for i in a:
for j in b:
for k in c:
if len(set((i,j,k)))==3:
print('a:%s,b:%s,c:%s'%(i,j,k))
题目 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.22
#题目 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
fenzi = 2
fenmu = 1
sum = 0
for i in range(20):
sum += fenzi/fenmu
#print(i, fenzi, fenmu, sum)
tmp = fenzi
fenzi = fenzi + fenmu
fenmu = tmp
print(sum)
#32.6602607986
安安笔记
自己的方法还是用了C语言中的方法,殊不知,python中有更直白的方法(交换两个变量的值,a, b = b, a),原因如下,原博客的代码就是直接这样写的
Python的变量并不直接存储值,而只是引用一个内存地址,交换变量时,只是交换了引用的地址。
********** 原博客 *********
程序分析 就是斐波那契数列的后一项除以前一项。
a = 2.0
b = 1.0
s = 0
for n in range(1,21):
s += a / b
a,b = a + b,a
print (s)
题目 求1+2!+3!+…+20!的和。
********** 原博客 *********
程序分析 1+2!+3!+…+20!=1+2(1+3(1+4(…20(1))))
res=1
for i in range(20,1,-1):
res=i*res+1
print(res)
********** 原菜鸟教程 *********
#!/usr/bin/python
# -*- coding: UTF-8 -*-
s = 0
l = range(1,21)
def op(x):
r = 1
for i in range(1,x + 1):
r *= i
return r
s = sum(map(op,l))
print '1! + 2! + 3! + ... + 20! = %d' % s
安安笔记
python map函数
>>>def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
题目 利用递归方法求5!。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.23
#题目 利用递归方法求5!。
def factorial(n):
return 1 if n == 1 else n*factorial(n-1)
print(factorial(4))
题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.23
#题目 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
#法1:非递归调用
# def reverse(str):
# print(str[::-1])
#法2:递归调用
def reverse(str):
print(str[-1], end="")
return reverse(str[:-1]) if len(str[:-1]) != 0 else print(" ")
reverse("anan")
reverse("xinxin")
安安笔记
1.python怎么把字符串最后一个字符去掉
说明:python去除字符串最后一个字符可以使用简单的切片法。
代码:
s = ‘abcdef’
print(s[:-1])
输出:abcde
备注:s[:-1]的意思就是s字符串取从第0个字符至倒数第一个字符的前一个字符,这样就达到了去掉最后一个字符的目的。
2.使用字符串长度判断
len(s) ==0 则字符串为空
题目 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.23
#题目 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
def age(n):
return age(n-1) +2 if n != 1 else 10
print(age(5))
实例029:反向输出
题目 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.23
#题目 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
n = input("请输入一个不对于5位的正整数:")
print("%s的位数为:%d,逆序输出为:%s" %(n, len(n), n[::-1]))
030:回文数
题目 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.23
#题目 一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
def huiwenshu(n):
n = str(n)
for i in range(len(n)//2):
if n[i] != n[-1-i]:
return False
return True
print(huiwenshu(12345))
print(huiwenshu(12321))
031:字母识词
题目 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
#!/usr/bin/python
# -*- coding: utf-8 -*-
#anan 2019.10.23
#题目 请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
week = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
character = input("请输入一个字符(单词首字母大写):")
week1 = []
n = 0
while True:
for i in week:
if i[n] == character:
week1.append(i)
week = week1[:]
week1.clear()
#print(week)
if len(week) == 1:
print(week[0])
break
else:
print("字符匹配多个星期")
character = input("请再输入一个字符:")
n += 1
安安笔记
1.使用clear()方法清除列表
lists = [1, 2, 1, 1, 5]
lists.clear()
print(lists)[]
2.关于clear之后,两个列表的关系
week1 = [1, 2, 3]
week = week1[:]
week
[1, 2, 3]
week1.clear()
week
[1, 2, 3]
********** 原博客 *********
程序分析 这里用字典的形式直接将对照关系存好。
weekT={'h':'thursday',
'u':'tuesday'}
weekS={'a':'saturday',
'u':'sunday'}
week={'t':weekT,
's':weekS,
'm':'monday',
'w':'wensday',
'f':'friday'}
a=week[str(input('请输入第一位字母:')).lower()]
if a==weekT or a==weekS:
print(a[str(input('请输入第二位字母:')).lower()])
else:
print(a)
题目 按相反的顺序输出列表的值。
********** 原博客 *********
程序分析 无。
a = ['one', 'two', 'three']
print(a[::-1])
题目 按逗号分隔列表。
********** 原博客 *********
程序分析 无。
L = [1,2,3,4,5]
print(','.join(str(n) for n in L))
安安笔记
1.已知输入形式是1+3+2+1,要求输出形式为1+1+2+3
print("+".join(sorted(input()[::2])))
or
print(’+’.join(sorted(input(“请输入:”).split(’+’))))
2.print(’,’.join(str(n) for n in L)) 还能这样写,太强了吧
题目 求100之内的素数。
在Python中,for-else用于处理遍历失败。
在for循环完整完成后才执行else;如果中途从break跳出,则连else一起跳出。
********** 原博客 *********
程序分析 用else执行for循环的奖励代码(如果for是正常完结,非break)。
lo=int(input('下限:'))
hi=int(input('上限:'))
for i in range(lo,hi+1):
if i > 1:
for j in range(2,i):
if (i % j) == 0:
break
else:
print(i)
题目 对10个数进行排序。
题目 求一个3*3矩阵主对角线元素之和。
1.疑问:如何输入矩阵
mat=[[1,2,3],
[3,4,5],
[4,5,6],
[5,6,7]
]
print(mat)
print(len(mat))
# [[1, 2, 3], [3, 4, 5], [4, 5, 6], [5, 6, 7]]
# 4
********** 原博客 *********
程序分析 无。
mat=[[1,2,3],
[3,4,5],
[4,5,6]
]
res=0
for i in range(len(mat)):
res+=mat[i][i]
print(res)
********** 原博客 *********
********** 原菜鸟教程 *********
计算字符串中最后一个出现某种符号的下标
str = "I am %s, is a %s girl."
#第一个%的下标是5
#第二个%的下标是14 倒着数是7
print(len(str)) #22
print(str.count("%")) #2
print(str.index("%")) #5
print(str[::-1].index("%"), str) #7 I am %s, is a %s girl.
print(len(str)-str[::-1].index("%")-1)
print(str.index("%") + 1 + str[str.index("%")+1:].index("%"))
计算字符串中最后一个出现某种符号的下标
str = "I am %s, is a %s girl, is %d years old."
#第一个%的下标是5
#第二个%的下标是14 倒着数是7
#第三个%的下标是26 倒着数是12
print(len(str)) #39
print(str[::-1].index("%"), str) #12 I am %s, is a %s girl.
print(len(str)-str[::-1].index("%")-1) #26 #计算字符串中最后一个出现某种符号的下标
print(str.index("%") + 1 + str[str.index("%")+1:].index("%")) #14
split输出
str = "cpe:2.3:a:foxitsoftware:foxit_reader:*:*:*:*:*:*:*:*"
print(str.split(":"))
#['cpe', '2.3', 'a', 'foxitsoftware', 'foxit_reader', '*', '*', '*', '*', '*', '*', '*', '*'] 生成一个列表
sorted排序
d = {"a":5, "b":1, "c":7}
print(sorted(d.items(), key=lambda item:item[1], reverse=True))
print(d)
#说明sorted排序不改变原序列 输出一个列表
# [('c', 7), ('a', 5), ('b', 1)]
# {'a': 5, 'b': 1, 'c': 7
}