Python123 练习5
1.一元二次方程求根 2.百钱买百鸡 3.鸡兔同笼 4.最大公约数和最小公倍数 5.判断三角形并计算面积 6.判断IP地址合法性 7.回文素数
文章目录
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 = (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('.')
if len(ip) == 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('输入错误')
如果文章内容或代码有问题,私信讨论
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)