Python123 练习5

1.一元二次方程求根

一元二次方程ax2+bx+c=0,a、b、c的值由用户在三行中输入,根据用户输入的数值求解方程的实数解:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
如果a值 为0,根据b值判断方程是否有解并输出,如果a与b同时为0,则输出Data error!‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
如果方程无实数解,输出“该方程无实数解”;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
如果方程有两个相同的实数解,输出一个解;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
如果方程有两个不同的实数解,在一行内按从大到小顺序输出方程的两个解,用空格分隔。
输入格式:输入三行数据, 每行输入一个实数
输出格式:方程的解

方法

import math  #导入math库
a = eval(input())
b = eval(input())
c = eval(input())
delta = pow(b,2)-4*a*c  #△=b^2-4ac
if a == 0:
    if b == 0:
        print('Data error!')
    else:
        print(-c/b)
else:
    if delta < 0:    #根据求解公式判断
        print('该方程无实数解')
    elif delta == 0:
        x = x = (math.sqrt(b*b-4*a*c)-b)/(2*a)
        print(x)
    elif delta > 0:
        x1 = (math.sqrt(b*b-4*a*c)-b)/(2*a)  #求和公式
        x2 = (-math.sqrt(b*b-4*a*c)-b)/(2*a)
        if x1 >x2:   #比较大小 按顺序输出
            print('{} {}'.format(x1,x2))
        else:
            print('{} {}'.format(x2,x1))

2.百钱买百鸡

我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,如果要求鸡翁、鸡母、鸡雏都不为零,问鸡翁、鸡母、鸡雏各几何?
输出格式
每行输出一组结果,按鸡翁数、鸡母数、鸡雏数的顺序输出,数字之间用空格分隔;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
如果有多组解时,按公鸡数量由少到多输出;

方法1 穷举循环嵌套

cock_1= 5           #一只公鸡价格
hen_1 = 3             #一只母鸡价格
chicken_1 = 1/3       #一只小鸡价格
a = int(100/cock_1)      #100元最多购买公鸡的数量整数
b = int(100/hen_1)       #100元最多购买母鸡的数量整数
c = int(100/chicken_1)   #100元最多购买小鸡的数量整数
cock = []      #公鸡数量空列表
hen = []       #母鸡数量空列表
chicken = []   #小鸡数量空列表
for i in range(1,a+1):               #遍历公鸡可能数量
    for j in range(1,b+1):            #遍历母鸡可能数量
        for k in range(1,c+1):        #遍历小鸡可能数量
            if i+j+k == 100:     #鸡的总数为100
                if cock_1*i+hen_1*j+chicken_1*k == 100:  #鸡的总价格为100
                    cock.append(i)    #将计算的可能公鸡数量加入公鸡列表
                    hen.append(j)     #将计算的可能母鸡数量加入母鸡列表
                    chicken.append(k) #将计算的可能小鸡数量加入小鸡列表
for l in range(len(cock)):   #获取公鸡数量的长度,并遍历循环
    print('{} {} {}'.format(cock[l],hen[l],chicken[l]))
#因为位置三者对应,即都按照遍历公鸡数量列表位置进行打印

方法2(方法一计算优化)

cock_1= 5           #一只公鸡价格
hen_1 = 3             #一只母鸡价格
chicken_1 = 1/3       #一只小鸡价格
a = int(100/cock_1)   #遍历公鸡可能数量
b = int(100/hen_1)    #遍历母鸡可能数量
c = 0            #小鸡初始量
cock = []        #公鸡数量空列表
hen = []         #母鸡数量空列表
chicken = []     #小鸡数量空列表
while c <= 100:   #c的值必定为3的倍数,限定范围
    c = c + 3     #每次循环c的值+3,始终为3的倍数,比上以个方法少了大量需要比较的变量c,提高效率
    for i in range(1,a):
        for j in range(1,b):   #只需循环遍历两个变量
            if i+j+c ==100 and cock_1*i+hen_1*j+chicken_1*c == 100:  #鸡的总数为100只,总价格也为100
                cock.append(i)        #将计算的可能公鸡数量加入公鸡列表
                hen.append(j)         #将计算的可能母鸡数量加入母鸡列表
                chicken.append(c)     #将计算的可能小鸡数量加入小鸡列表
for l in range(len(cock)):            #获取公鸡数量的长度,并遍历循环
    print('{} {} {}'.format(cock[l],hen[l],chicken[l]))
#因为位置三者对应,即都按照遍历公鸡数量列表位置进行打印

3.鸡兔同笼

大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:
今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?
这四句话的意思是:
有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
输入格式:在一行里输入两个整数,用空格分隔
输出格式:在一行里输出两个正整数,分别是鸡和兔的数量,用空格分隔。若无解则输出Data Error!

方法

a,b = map(int,input().split(' '))
if (a>0 and b>0 and a<b and b%2==0 and b-2*a>0):  #头和脚数量成立的条件
    for x in range(1,a+1):    #遍历循环鸡的数量
        y = a-x
        if 2*x + 4*y == b:   
            print('{} {}'.format(x,y))
            break
        if y==0:
            print('Data Error!')
            
else:
    print("Data Error!")

4.最大公约数和最小公倍数

本题要求两个给定正整数的最大公约数和最小公倍数。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬ ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬
输入格式:两行输入:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬每行给出一个正整数(≤1000)。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
输出格式:在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

方法1 穷举循环

a = int(input())
b = int(input())
if a >= b:   #最大公约数一定小于等于两个数之间较小的那个  比较大小确定范围
    for i in range(1,b+1):  #穷举所有可能的公约数
        if (a%i==0) and (b%i==0):  #a,b对i求余均为0,此时i即为公约数
            result1 = i          #将i赋值给result1,for循环结束必为最大的
else:         
    for j in range(1,a+1):
        if (a%j==0) and (b%j==0):
            result1 = j
result2 = a*b/result1     #最小公倍数为 两数乘积除以最大公约数
print('{} {}'.format(int(result1),int(result2)))

方法2 math.gcd()

import math
a = int(input())
b = int(input())
result1 = math.gcd(a,b)  #math.gcd(x,y)函数,求x,y的最大公约数
result2 = a*b/result1
print('{} {}'.format(int(result1),int(result2)))

5.判断三角形并计算面积

输入三个数a,b,c, 判断能否以它们为三个边长构成三角形。
若能,输出YES和三角形面积(结果保留2位小数),否则输出NO。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

方法

import math   #调用math库
a = float(input())
b = float(input())
c = float(input())
if a + b > c and a + c > b and b + c > a:      #三角形成立条件判断两边之长大于第三边
    girth = a + b + c      # 三角形周长
    p = girth/2         #海伦公式求三角形面积
    area = math.sqrt(p * (p - a) * (p - b) * (p - c))  #调用math.sqrt()求平方根函数  
    print('YES')
    print('{:.2f}'.format(area))
else:
    print('NO')

6.判断IP地址合法性

互联网上的每台计算机都有一个独一无二的编号,称为IP地址,每个合法的IP地址由’.‘分隔开的4个数字组成,每个数字的取值范围是0-255。
现在用户输入一个字符串(不含空白符,不含前导0,如001直接输入1),请你判断s是否为合法IP,
若是,输出’Yes’,否则输出’No’。
如用户输入为202.114.88.10, 则输出Yes; 当用户输入202.114.88,则输出No

方法

ip = input()
ip = ip.split('.')   #split()分割字符串,这里以  . 为分割处,生成数字列表
if len(ip) == 4:   #判断列表中元素个数是否为4
	for i in range(4):        #遍历循环
		if ip[i].isdigit() == False or  eval(ip[i]) > 255 or eval(ip[i]) < 0: #判断字符串是否全为数字
			print('No')
			break    #停止循环
	else: 
		if i == 3:  #判断条件到循环最后一位
		    print('Yes')
else:
    print('No') 

'''str.isdigit()如果字符串str只包含数字(包括:Unicode数字,半角数字(单字节),全角数字(双字节),
不包括罗马数字和汉字数字)则返回 True 否则返回 False。'''

7.回文素数

回文素数是指一个数既是素数又是回文数。例如,131,既是素数又是回文数。用户输入一个正整数n(1 <= n <= 100), 请你在一行内输出从小到大排列的的前n个回文素数,数字之间用空格分隔。
输入格式:输入一个正整数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
输出格式:符合要求的回文素数

方法

a = int(input())
b = []   #赋值空列表,后续假如计算得出的回文素数
n = 1    #初始值
while len(b) < a:   #若列表得出的回文数小于目标,循环执行
    n = n+1   #每次循环测试的数+1 
    if str(n) == str(n)[::-1]:  #比较是否回文数
        for i in range(1,n):    #遍历循环 除去本身 求余数判断是否素数
            if n % i == 0:
                x = i          #得出循环完最大的余数
        else:
            if x == 1:    #根据素数的特性 除本身之外公因数只有1
                b.append(str(n))#append方法将所得回文素数加入列表
print("{}".format(" ".join(b)),end=" ")  #join方法将最后列表转为字符串

8.反素数

反素数(逆向拼写的素数)是指一个将其逆向拼写后也是一个素数的非回文数。例如:13和31都是素数,且13和31都不是回文数,所以,13和31是反素数。输入一个正整数n(1 <= n <= 100), 请输出从小到大排列的的前n个反素数,数字间以空格进行分隔。
输入格式:输入一个正整数
输出格式:符合条件的反素数

方法

a = int(input())
b = []
n = 1
while len(b) < a: 
    n = n + 1   # 注意后续不能改变n的值
    if (n>10) and (str(n) != str(n)[::-1]):  #不能为回文数,所以一定大于10
        for i in range(1,n):
            if n % i == 0:
                x = i
        else:
            if x == 1:   #不是回文数且为复数
                c = str(n)[::-1]  #反转数赋值给新常量
                for j in range(1,int(c)): #同理变量循环穷举判断素数
                    if int(c) % j == 0:
                            y = j
                else:
                    if y == 1:
                        b.append(str(n))  #append方法将所得回文素数加入列表
print("{}".format(" ".join(b)),end=" ")   #join方法将最后列表转为字符串

9.今天是第几天

描述
输入年月日,判断这一天是这一年的第几天?
输入格式包括三行:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
第一行是一个不超过四位数的正整数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
第二行是一个不超过12的正整数 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
第三行是一个不超过31的正整数‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
输出格式
某年某月某日是某年的第多少天

方法1

a = eval(input())
b = eval(input())
c = eval(input())
if (a % 4 == 0 and a % 100 != 0) or a % 400 == 0:    #闰年 2月份为29天
    mouth = [0,31,60,91,121,152,182,213,244,274,305,335]   #闰年前n个月总天数的列表
    sum = mouth[b-1]  #切片,输入月份对应总天数
    d = sum + c           #月份总天数加上当月天数 即当年第几天
    print('{0}年{1}月{2}日是{0}年第{3}天'.format(a,b,c,d))

else:                           #非闰年 2月份为28天
    mouth = [0,31,59,90,120,151,181,212,243,273,304,334]     #前n个月总天数的列表
    sum = mouth[b-1]    #切片,输入月份对应总天数
    d = sum + c      #月份总天数加上当月天数 即当年第几天
    print('{0}年{1}月{2}日是{0}年第{3}天'.format(a,b,c,d))
'''
闰年 1. 能被4整除,并且不能被100整除
     2. 能被400整除
'''

方法2

a = eval(input())
b = eval(input())
c = eval(input())
mouth = [0,31,59,90,120,151,181,212,243,273,304,334]     #非闰年 前n个月总天数的列表
sum = mouth[b-1] + c     #非闰年  月份总天数加上当月天数 即当年第几天
if (a % 4 == 0 and a % 100 != 0) or a % 400 == 0:       #闰年
   if b <= 2:         #闰年前两个月计算方式与非闰年相同
       print('{0}年{1}月{2}日是{0}年第{3}天'.format(a,b,c,sum))
   else:       #闰年两个之后的月份总天数比非闰年多一天
       print('{0}年{1}月{2}日是{0}年第{3}天'.format(a,b,c,sum+1))   #sum+1
else:    #非闰年
   print('{0}年{1}月{2}日是{0}年第{3}天'.format(a,b,c,sum))
'''
闰年 1. 能被4整除,并且不能被100整除
     2. 能被400整除
'''

10.提取首字符

用户输入一串单词或数字,中间用空格分隔,提取每个单词或数字的第一个字符生成一个新的字符串并输出。
输入格式:一个包括空格的字符串,以回车结束输入
输出格式:提取每个单词或数字的第一个字符生成的一个新的字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬.

方法

a = input()
a = a.split(' ') #字符串从每个空格间切割,并合成一个列表a
b = []    #创建一个空列表
for i in range(len(a)):  #读取列表a中元素个数,遍历循环
    b.append(a[i][0])    #每个元素第一项使用append方法加入b列表中
print('{}'.format(''.join(b)))  #合并列表为字符串

11.判断火车票座位

用户输入一个数字和一个字母组成的座位号,根据字母判断位置是窗口还是过道。目前中国高铁和国内飞机窗口位置的字母是’A’和’F’,过道位置是’C’和 ‘D’,中间位置是’E’。
每个车厢座位排数是1-17,字母不区分大小写。
输入格式:输入一个数字和字母组合成的字符串‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬。
输出格式:'窗口'或'过道' 或'输入错误'。

方法

a = input()
if 2 <= len(a) <= 3:   #判断输入的座位号长度
    if a[0:-1].isdigit() == True and 1<=int(a[0:-1])<=17:    #座位号由数字和最后一位字母组成,且数字有范围
        if a[-1] in ['a','f','A','F']:    #判断最后一位字母
            print("窗口")
        elif a[-1] in ['c','d','C','D']:  #判断最后一位字母
            print("过道")
        else:
            print("输入错误")
    else:
        print("输入错误")
else:
    print('输入错误')
发布了14 篇原创文章 · 获赞 21 · 访问量 6910

猜你喜欢

转载自blog.csdn.net/weixin_46283583/article/details/104942118
今日推荐