python3 100例(安安)

原链接:https://blog.csdn.net/weixin_41084236/article/details/81564963
原菜鸟教程:https://www.runoob.com/python/python-100-examples.html

001:数字组合

题目 有四个数字: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)

002:“个税计算”

题目 企业发放的奖金根据利润提成。利润(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)

003:完全平方数

题目 一个整数,它加上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)

004:这天第几天

题目 输入某年某月某日,判断这一天是这一年的第几天?

#!/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)

005:三数排序

题目 输入三个整数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))

006:斐波那契数列

题目 斐波那契数列。

安安笔记
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)

007:copy

题目 将一个列表的数据复制到另一个列表中。

#!/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']]

008:九九乘法表

题目 输出 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()

009:暂停一秒输出

题目 暂停一秒输出。

几个时间函数的讲解,可点击此处进行了解

********** 原博客 *********
程序分析 使用 time 模块的 sleep() 函数。

import time
for i in range(4):
    print(str(int(time.time()))[-2:])
    time.sleep(1)

010:给人看的时间

题目 暂停一秒输出,并格式化当前时间。

********** 原博客 *********
程序分析 同009.

import time

for i in range(4):
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
    time.sleep(1)

011:养兔子

题目 有一对兔子,从出生后第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

012:100到200的素数

题目 判断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)

013:所有水仙花数

题目 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如: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

014:分解质因数

题目 将一个整数分解质因数。例如:输入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
  

015:分数归档

题目 利用条件运算符的嵌套来完成此题:学习成绩>=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)

016:输出日期

题目 输出指定格式的日期。
********** 原博客 *********
程序分析 使用 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)

017:字符串构成

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

********** 原博客 *********
程序分析 利用 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()

018:复读机相加

题目 求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)

019:完数

题目 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如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)

020:高空抛物

题目 一球从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)))

021:猴子偷桃

题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第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

022:比赛对手

题目 两个乒乓球队进行比赛,各出三人。甲队为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))

024:斐波那契数列II

题目 有一分数序列: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)

025: 阶乘求和

题目 求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]

026:递归求阶乘

题目 利用递归方法求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))

027:递归输出

题目 利用递归函数调用方式,将所输入的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 则字符串为空

028:递归求等差数列

题目 有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)

032:反向输出II

题目 按相反的顺序输出列表的值。

********** 原博客 *********
程序分析 无。

a = ['one', 'two', 'three']
print(a[::-1])

033:列表转字符串

题目 按逗号分隔列表。

********** 原博客 *********
程序分析 无。

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)) 还能这样写,太强了吧

036:算素数

题目 求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)

037:排序

题目 对10个数进行排序。

038:矩阵对角线之和

题目 求一个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', '*', '*', '*', '*', '*', '*', '*', '*']   生成一个列表  

python3 100例(安安)_第1张图片


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

}

你可能感兴趣的:(python)