python练习题

100道python练习,参考链接:https://github.com/woider/PythonExercise#%E9%A2%98%E7%9B%AE-1

题目 1

有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?

可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。

for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            if j != k and i!=j and i!=k:
                print(i,j,k)

 

题目 2

企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?

请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

2021-05-14  12:26:23  周五  打卡

I = float(input("请输入当月利润,单位为万元\n"))
bns = 0  #初始化奖金总数
cat = [100, 60, 40, 20, 10, 0]  #金额分6档
pct = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1]  #每档的提成比例
for i in range(6):
    if I > cat[i]:
        I = I - cat[i]  #注意:刨掉档位金额后,应将值重新赋给I,每一档位分开计算
        bns = bns + I * pct[i]  #每一档位的奖金累计相加
print('当月应发放奖金总数为%s万元' % bns)

题目 3

一个整数,它加上100和加上268后都是一个完全平方数,请问该数是多少?

在10000以内判断,将该数加上100后再开方,加上268后再开方,如果开方后的结果满足如下条件,即是结果。

import math
for i in range(1,10001):
    a = int(math.sqrt(i+100))
    b= int(math.sqrt(i+268))
    if a*a==(i+100)  and b*b==(i+268):
        print(i)

题目 4

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

以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天。

days = [31,28,31,30,31,30,31,31,30,31,30,31]
inputText = input()
years = inputText[0:4]
months = inputText[4:6]
day = inputText[6:]
if (int(months)%4==0 and int(months)%100 !=0) or int(months)%400==0:
    days[1]=29
nums=0
for i in range(0,int(months)-1):
    print(days[i])
    nums +=days[i]
print(nums+int(day))

题目 5

输入三个整数x,y,z,请把这三个数由小到大输出。

我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。

print("*"*50+"请输入第1个数"+"*"*50)
num1_input=int(input())
print("*"*50+"请输入第2个数"+"*"*50)
num2_input=int(input())
print("*"*50+"请输入第3个数"+"*"*50)
num3_input=int(input())

list2=[num1_input,num2_input,num3_input]
list1=[1,2,4,56,7,3,3,45,23,45,456,565,3434,232,3]
n=len(list1)
for i in range(0,n):
    for j in range(0,n-1-i):
        if list1[j]>list1[j+1]:
            list1[j],list1[j+1] = list1[j+1],list1[j]
print(list1)

题目 6

斐波那契数列。

斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……。

begin=[0,1]
listlen=20
result = 1
for i in range(0,listlen-2):
    nums= begin[i]+begin[i+1]
    begin.append(nums)
print(begin)

题目 7

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

使用列表[:]。

list1=[1,2,3,4]
list2 =list1[:]

 

题目 8

输出 9*9 乘法口诀表。

分行与列考虑,共9行9列,i控制行,j控制列。

for i in range(1,10):
        for j in range(1,i+1):
            print("{}*{}={}".format(j,i,i*j),end=" ")
        print("\n")

题目 9

模拟Linux用户登录。

验证账号和密码,若失败则延迟三秒输出错误信息。

import time
root ="root"
password="123456"

times=1
while times<=3:
    user_input=input("user:")
    password_input=input("Enter password:")
    if user_input == root:
        if password_input !=password:
            time.sleep(3)
            print("账号或密码错误,请重新输入")
        else:
            print("欢迎")
            exit()
    else:
        if password_input !=password:
            time.sleep(3)
            print("账号或密码错误,请重新输入")
        else:
            time.sleep(3)
            print("账号或密码错误,请重新输入")
    print("你还有{}次机会!".format(3-times))
    times+=1

题目 10

格式化输出当前时间。

使用 time 模块,格式为 yyyy-mm-dd HH:mm:ss。

import time
now_time = time.strftime('%Y-%m-%d %H:%M:%S')
print(now_time)

题目 11

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

兔子的规律为数列1,1,2,3,5,8,13,21....

2021-04-22   11:54:58  周四   打卡

思路:一对兔子,在成熟期生兔子
月份         刚出生    半成熟     成熟
第1个月         1         0         0
第2个月         0         1         0
第3个月         1         0         1 (成熟并生下一对)
第4个月         1         1         1 (生下一对,3月生下的进入半成熟)
第5个月         2         1         2 (生下一对,2个月生下的进入成熟并生下一对,同时4月生下的进入半成熟)
第6个月         3         2         3
第7个月         5         3         5
规律:1,1,2,3,4,8,13,。。。

'''
fisrt_month = 1
second_month = 1
month=[1,2,3,4,5,6,7,8,9,10,11,12]
list1=[fisrt_month,second_month]
begin = 0
while begin<12:
  last=list1[begin]+list1[begin+1]
  list1.append(last)
  begin+=1
# print(list1)
# print(dict(zip(month,list1)))
for i,j in dict(zip(month,list1)).items():
  print("第{}个月有{}只兔子".format(i,j*2))

题目 12

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

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

题目 13

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

利用for循环控制100-999个数,每个数分解出个位,十位,百位。

#2021-04-14   10:01:22  周三
for
i in range(100,1000): first=int(str(i)[0]) second = int(str(i)[1]) third = int(str(i)[2]) if i== first**3 + second**3 + third**3: print(i)

题目 14

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

对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

2021-04-29    10:06:31   周四  打卡

class Factorization():
  def __init__(self,nums):
    self.nums = nums
    self.copy_nums = self.nums #拷贝一个,以便输出格式化
  def nums_factor(self):
    if self.nums == 2:
      return self.nums
    else:
      list1=[]  #存放分解的因数
      begin = 2
      
      while begin <=self.nums:
        if self.nums % begin == 0:
          list1.append(str(begin))
          list1.append('*')  #以便格式化
          self.nums = self.nums /begin
        else:
          begin += 1
      str_factor="".join(list1)
      result ="{}={}".format(self.copy_nums,str_factor[:len(str_factor)-1]) #去除最后一个*
      return result
      
if __name__ == '__main__':  
  print(Factorization(100).nums_factor())

题目 15

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

程序分析:(a>b)?a:b这是条件运算符的基本例子。

2021-04-28    09:38:36   周三  打卡

#注:未考虑输入为非数字情况
score_input = int(input("请输入成绩:\n"))
if score_input >= 90 and score_input <= 100:
  print("{}分属于等级A".format(score_input))
elif score_input >=60 and score_input <90:
  print("{}分属于等级B".format(score_input))
elif score_input >=0 and score_input <60:
  print("{}分属于等级C".format(score_input))
else:
  print("输入的成绩不规范,请重新输入,成绩在0——100之间")

题目 16

输出指定格式的日期。

使用 datetime 模块。


#2021-04-15   09:38:22  周三

import
datetime print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

题目 17

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

利用while语句,条件为输入的字符不为'\n'。

2021-05-12  09:58:15   周三  打卡

def str_numbers(): 
  str_input = input("请输入一行字符串\n")
  letter=[] #字母
  blankSpace=[]  #空格
  numbers=[] #数字
  otherCharacter=[] #其它字符
  if str_input == "\n":
    return "字符为空"
  else:
    for i in str_input:
      if i.isalpha(): #字母
        letter.append(i)
      elif i.isdigit():  #数字
        numbers.append(i)
      elif i ==" ": #空格
        blankSpace.append(i)
      else:  #其它字符
        otherCharacter.append(i)

    result = "英文字母为{letter},有{letter_number}个;\n数字为{numbers},有{numbers_number}个;\n空格为{blankSpace},有{blankSpace_number}个;\n其它字符为{otherCharacter},有{otherCharacter_number}个.\n".format(letter=letter,letter_number=len(letter),numbers=numbers,numbers_number=len(numbers),blankSpace=blankSpace,blankSpace_number=len(blankSpace),otherCharacter=otherCharacter,otherCharacter_number=len(otherCharacter))

    return result

print(str_numbers())
#参考:https://www.cnblogs.com/wangboqi/p/7455240.html

 

题目 18

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

关键是计算出每一项的值。

#2021-04-16   09:49:45  周三
inputNum=input("请输入数字\n")
inputLen=int(input("请输入长度"))
s=0
list1=[]
for i in range(1,inputLen+1):
    s=s+int(i*inputNum)
print(s)

题目 19

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

请参照程序Python 练习实例14。

 

题目 20

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

利用循环计算每一次小球落地的高度。

2021-04-17  23:02:00   周六   打卡

hight = 100
n=1
sums=0
while n<=10:
    sums =sums + hight
    hight = 0.5*hight
    #print("第{}次落地时,经过了{}米,反弹了{}米。".format(n,sums,hight))
    n+=1
print("第10次落地时,经过了{}米,反弹了{}米。".format(sums,hight))

题目 21

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

采取逆向思维的方法,从后往前推断。

2021-04-18    14:40:42   星期六  打卡

days=10
sums=1
while days>=1:
    #print("第{}天剩下{}个桃子".format(days,sums))
    sums = 2 * sums + 1
    days -=1
print("第一天共摘了{}".format(sums))

 

题目 22

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

先进行排列组合,再挑选符合要求的组合。

2021-05-13   12:53:43   周四   打卡

'''
解析:先进行排列组合,再挑选符合要求的组合。
总的排列组合有3*2*1=6,即:
[
  [('a','x'),('b','y'),('c','z')],
  [('a','x'),('b','z'),('c','y')],
  [('a','y'),('b','z'),('c','x')],
  [('a','y'),('b','x'),('c','z')],
  [('a','z'),('b','x'),('c','y')],
  [('a','z'),('b','y'),('c','x')],
]
'''
for i in ['x','y','z']:
    for j in ['x','y','z']:
        if i!=j:
            #print(i,j)
            for k in['x','y','z']:
                if (k!=i and k!=j)and i!='x'and k!='x'and k!='z':
                    print("a对阵%s  b对阵%s  c对阵%s"%(i,j,k))

题目 23

利用循环打印菱形

先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。

2021-04-19    16:19:25   周一   打卡

def ling(a):
    for i in range(1,a+1):
        result = (a-i+1)*' '+i*'* '
        print(result)
    for j in range(a-1,0,-1):
        result2 = (a-j+1)*' '+j*'* '
        print(result2)

ling(4)

 

题目 24

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

请抓住分子与分母的变化规律。

2021-05-11  09:54:23    周二  打卡

五一放假回家,家中亲人意外离世,没有电脑,中途10天后续补上

def Mark_Sums():
  first_mark_numerator = 2  #第一个分数分子
  first_mark_denominator = 1  #第一个分数分母
  first_mark = first_mark_numerator / first_mark_denominator
  times = 1 #次数
  list1= [first_mark]
  while times <=20:
    next_mark_numerator = first_mark_numerator + first_mark_denominator
    next_mark_denominator = first_mark_numerator
    next_mark = next_mark_numerator / next_mark_denominator
    first_mark_numerator = next_mark_numerator
    first_mark_denominator = next_mark_denominator
    first_mark = next_mark
    list1.append(next_mark)
    times+=1
    sums = sum(list1)
  return sums

print(Mark_Sums())

 

题目 25

求1+2!+3!+...+20!的和。

此程序只是把累加变成了累乘。

2021-04-27   09:51:19   周二  打卡

import math
def factorial_values(n):
  sums = 0
  print(math.factorial(1))
  for i in range(1,n+1):
    print("第{}次:{}的阶乘等于{}".format(i,i,math.factorial(i)))
    sums = sums+math.factorial(i)
  return sums

题目 26

利用递归方法求5!。

递归公式:fn=fn_1*4!

2021-04-26   10:05:31   周一   打卡

import math
def factorial_values(n):
  if n == 0:
    return 1
  else:

    return math.factorial(n)
print(factorial_values(5))
  

 

题目 27

利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。

递归实际上是一种函数堆栈。

题目 28

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

利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。

2021-04-25   10:17:36   周日  打卡

'''
思路:
a     b     c     d     e
10   x-6   x-4    x-2    x
是一个等差数列,首项为10,公差为2,求第5项。
等差数列求和公式:an=a1+(n-1)d   前n项和:Sn=n*a1+n(n-1)d/2 或Sn=n(a1+an)/2
'''
first_age=10
xiangcha = 2
print("第5个人{}岁".format(10+(5-1)*2))

 

题目 29

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

学会分解出每一位数。

2021-04-21  09:21:53   周三   打卡

#方法1
import random
numbers = random.randint(0,99999)
str1 = str(numbers)
print("这是{}位数".format(len(str1)))
for i in str1:
    print("各位数字分别是{}".format(i))

 

题目 30

一个5位数,判断它是不是回文数。

回文数,个位与万位相同,十位与千位相同。

2021-04-20   09:49:51   周二  打卡

for i in range(10001,100000):
    i=str(i)
    if i[4]==i[0] and i[3]==i[1]:
        print("{}是回文数!".format(i))
posted @ 2021-03-30 17:16  惜阙  阅读(469)  评论(0编辑  收藏  举报