python第一次上机练习
7-1 jmu-python-运算符-找钱
买单时,营业员要给用户找钱。营业员手里有10元、5元、1元(假设1元为最小单位)几种面额的钞票,其希望以尽可能少(张数)的钞票将钱换给用户。比如,需要找给用户17元,那么其需要给用户1张10元,1张5元,2张1元。 而不是给用户17张1元或者3张5元与2张1元。
输入格式: 输入n,代表要进行n次测试。 然后输入n行整数,每行代表要找的钱。
输出格式: 按照如下格式输出,x代表要找的钱总数,?代表每种面额所需的数量。
x = ?*10 + ?*5 + ?*1
注意: = 与 +左右均有空格。
输入样例:
5
109
17
10
3
0
输出样例:
109 = 10*10 + 1*5 + 4*1
17 = 1*10 + 1*5 + 2*1
10 = 1*10 + 0*5 + 0*1
3 = 0*10 + 0*5 + 3*1
0 = 0*10 + 0*5 + 0*1
代码:
def Jmu(a):
x = 0
y = 0
z = 0
b = a
while True:
if a >= 10:
a -= 10
x += 1
elif a >= 5:
a -= 5
y += 1
elif a > 0:
a -= 1
z += 1
else:
break
print("%d = %d*10 + %d*5 + %d*1" % (b, x, y, z))
# print("{} = {}*10 + {}*5 + {}*1".format(b, x, y, z))
n = eval(input())
for i in range(n):
a = eval(input())
Jmu(a)
7-2 jmu-python-是否偶数
输入一个整数,判断是否偶数
输入样例:
7
输出样例:
7不是偶数
输入样例:
8
输出样例:
8是偶数
代码:
a =int(input())
if a % 2 == 0:
print("%d是偶数" % a)
else:
print("%d不是偶数" % a)
7-3 jmu-python-求三角形面积及周长
输入的三角形的三条边a、b、c,计算并输出面积和周长。假设输入三角形三边是合法整形数据。
三角形面积计算公式:
,其中
s=(a+b+c)/2
import math #导入math库
math.sqrt(x) #调用sqrt函数实现开平方运算,x表示要求值的数据
输入格式:
每行输入一个数据,表示三角形一条边。
输出格式:
area=面积;perimeter=周长
, 面积和周长保留2位小数
输入样例:
3
4
5
输出样例:
area=6.00;perimeter=12.00
代码:
import math
a = eval(input())
b = eval(input())
c = eval(input())
s = (a+b+c)/2
area = math.sqrt(s*(s-a)*(s-b)*(s-c))
perimeter = a+b+c
print("area=%.2f;perimeter=%.2f" % (area, perimeter))
7-4 jmu-分段函数l
本题目要求计算以下分段函数的值(x为从键盘输入的一个任意实数):
如果输入非数字,则输出“Input Error!”
输入格式: 在一行中输入一个实数x。
输出格式: 在一行中按”y=result”的格式输出,其中result保留两位小数。
输入样例:
-2
输出样例: 在这里给出相应的输出。例如:
y=3.00
代码:
# 运行错误时,主动抛出异常
def demo1(x):
if x > 1:
y = 2 * x + 1
elif x > -2:
y = 3
else:
y = -2 * x - 1
print("y={:.2f}".format(y))
try:
x = eval(input())
demo1(x)
except Exception as result:
print("Input Error!")
python第二次上机练习
7-1 jmu-python-回文数判断(5位数字)
本题目要求输入一个5位自然数n,如果n的各位数字反向排列所得的自然数与n相等,则输出yes,否则输出no。
输入格式:
13531
输出格式:
yes
输入样例1:
13531
输出样例1:
yes
输入样例2:
13530
输出样例2:
no
代码:
num1 = eval(input())
num = num1
num3 = 0
for i in range(5):
num2 = num1 % 10
num1 = (num1 - num2) / 10
num3 += num2 *(10 ** (4-i))
if num3 == num:
print("yes")
else:
print("no")
7-2 jmu-python-凯撒密码加密算法
编写一个凯撒密码加密程序,接收用户输入的文本和密钥k,对明文中的字母a-z和字母A-Z替换为其后第k个字母。
输入格式:
接收两行输入,第一行为待加密的明文,第二行为密钥k。
输出格式:
输出加密后的密文。
输入样例:
在这里给出一组输入。例如:
Hello World!
3
输出样例:
在这里给出相应的输出。例如:
Khoor Zruog!
代码:
ch = input()
k = int(input())
a = 'abcdefghijklmnopqrstuvwxyz'
A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
for i in ch:
if 'a'<= i<= 'z':
n = a.find(i)
print(a[(n + k + 26)%26],end='')
elif 'A'<= i <='Z':
n = A.find(i)
print(A[(n + k + 26)%26],end='')
else:
print(i,end = '')
7-3 你好
你的程序会读入一个名字,比如John,然后输出“Hello John”。
输入格式:
一行文字。
输出格式:
一行文字。
输入样例:
Mary Johnson
输出样例:
Hello Mary Johnson
代码:
name1 = input()
print('Hello ' + name1)
7-4 Py的A+B
程序会读入两行,每行都是一个数字,输出这两个数字的和
输入格式:
两行文字,每行都是一个数字
输出格式:
一行数字
输入样例:
18
21
输出样例:
39
代码:
num1 = eval(input())
num2 = eval(input())
num = num1 + num2
print(num)
7-5 摄氏温度转换华氏温度
温度刻画存在不同体系,摄氏度以1标准大气压下水的结冰点为0度,沸点为100度,将温度进行等分刻画。华氏度以1标准大气压下水的结冰点为32度,沸点为212度,将温度进行等分刻画。
根据华氏和摄氏温度定义,转换公式如下:
C = ( F – 32 ) / 1.8
F = C * 1.8 + 32
输入格式:
一个不带小数点的数字,表示设摄氏温度。
输出格式:
一个表示华氏温度的数字。请直接采用print()输出计算结果,不需要对输出格式做处理。
输入样例:
36
输出样例:
96.8
代码:
C = eval(input())
F = C * 1.8 + 32
print(F)
7-6 从键盘输入三个数到a,b,c中,按公式值输出
在同一行依次输入三个值a,b,c,用空格分开,输出b*b-4*a*c的值
输入格式:
在一行中输入三个数。
输出格式:
在一行中输出公式值。
输入样例:
在这里给出一组输入。例如:
3 4 5
输出样例:
在这里给出相应的输出。例如:
-44
代码:
a,b,c = map(int,input().split())
print(b * b - 4 * a * c)
7-7 产生每位数字相同的n位数
读入2个正整数A和B,1<=A<=9, 1<=B<=10,产生数字AA...A,一共B个A
输入格式:
在一行中输入A和B。
输出格式:
在一行中输出整数AA...A,一共B个A
输入样例1:
在这里给出一组输入。例如:
1, 5
输出样例1:
在这里给出相应的输出。例如:
11111
输入样例2:
在这里给出一组输入。例如:
3 ,4
输出样例2:
在这里给出相应的输出。例如:
3333
代码:
A,B = map(int,input().split(','))
for i in range(B):
print("%d" % A,end = '')
python第三次(上机)练习
7-1 jmu-python-汇率兑换
按照1美元=6人民币的汇率编写一个美元和人民币的双向兑换程序
输入格式:
输入人民币或美元的金额,人民币格式如:R100,美元格式如:$100
输出格式:
输出经过汇率计算的美元或人民币的金额,格式与输入一样,币种在前,金额在后,结果保留两位小数
输入样例1:
R60
输出样例1:
$10.00
输入样例2:
$5
输出样例2:
R30.00
代码:
money = input()
if money[0] == 'R':
R_num = int(money[1:])
M_num = R_num / 6.0
print("$%.2f" % M_num)
elif money[0] == '$':
M_num = int(money[1:])
R_num = M_num * 6.0
print("R%.2f" % R_num)
7-2 jmu-python-九九乘法表(矩形)
本题目要求输出如下图所示的九九乘法表
注:乘积要求做格式控制,占4个位置的宽度
输入样例: 无
输出样例:
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
代码:
for x in range(1, 10, 1):
if x>1:
print()
for y in range(1, 10, 1):
print("%d*%d=%-4d" % (x, y, x * y), end="")
7-3 jmu-python-判断是否构成三角形
输入三角形的三边,判断是否能构成三角形。若能构成输出yes,否则输出no。 输入格式:
在一行中直接输入3个整数,3个整数之间各用一个空格间隔,没有其他任何附加字符。
输出格式:
直接输出yes或no,没有其他任何附加字符。
输入样例1:
3 4 5
输出样例1:
yes
输入样例2:
1 2 3
输出样例2:
no
代码
x, y, z = map(int, input().split(" "))
if (x + y > z) and (x + z > y) and (y + z > x):
print("yes")
else:
print("no")
7-4 jmu_python_最大公约数&最小公倍数
本题要求从键盘输入两个整数(以逗号间隔),编程求出这两个数的最大公约数和最小公倍数
提示: 求最大公约数可用辗转相除法,最小公倍数用两数的积除以最大公约数 输入格式:
在一行中输入两个整数,以逗号间隔
输出格式:
输出“GCD:a, LCM:b",其中a为求出的最大公约数,b为求出的最小公倍数
注意:在逗号后面有个空格
输入样例:
12,14
输出样例:
GCD:2, LCM:84
代码:
def gcd(a, b):
while b != 0:
temp = a % b
a = b
b = temp
return a
a, b = map(int, input().split(","))
print("GCD:%d, LCM:%d" % (gcd(a, b), a * b / gcd(a, b)))
7-5 转换函数使用
输入一个整数和进制,转换成十进制输出
输入格式:
在一行输入整数和进制
输出格式:
在一行十进制输出结果
输入样例:
在这里给出一组输入。例如:45,8
输出样例:
在这里给出相应的输出。例如: 37
代码:
'''
基数:base
'''
num_str, base = map(str, input().split(","))
num_end = 0 # 记录最终结果
num_len = len(num_str)
for i in range(0, num_len, 1):
num_int = int(num_str[num_len - i - 1])
num_end = num_end + num_int * (int(base) ** i)
print(num_end)
7-6 水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。 本题要求编写程序,计算所有N位水仙花数。
输入格式: 输入在一行中给出一个正整数N(3≤N≤5)
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
153
370
371
407
代码
'''
理解:
以三位数为例,所取数的范围是[100,1000);
for i in range(100,1000):
num_str = str(i)
temp1 = int(num_str[0])
temp2 = int(num_str[1])
temp3 = int(num_str[2])
if temp1 ** 3 + temp2 ** 3 + temp3 ** 3 == i:
print(i)
输入N位数字时,就是对三位水仙花数的改进
'''
def p(a, b):
num = 1
for i in range(1, b + 1, 1):
num = num * a
return num
N = int(input()) # N位正整数
begin = p(10, N - 1)
end = p(10, N)
for i in range(begin, end, 1):
num_str = str(i)
add = 0
for j in range(0, N, 1):
temp = int(num_str[j])
add = add + temp ** N
if add == i:
print(i)
continue # 可以省略
7-7 jmu-python-成绩转换
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A; 小于90且大于等于80为B; 小于80且大于等于70为C; 小于70且大于等于60为D; 小于60为E。
输入样例:
98
输出样例:
A
代码:
# 省事版
grade = int(input())
if grade >= 90:
print("A")
elif grade >= 80:
print("B")
elif grade >= 70:
print("C")
elif grade >= 60:
print("D")
else:
print("E")
7-8 jmu-python-韩信点兵
在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
按从1至5报数,记下最末一个士兵报的数为1; 再按从1至6报数,记下最末一个士兵报的数为5; 再按从1至7报数,记下最末一个士兵报的数为4; 最后按从1至11报数,最末一个士兵报的数为10; 请编写程序计算韩信至少有多少兵。
输入格式:
无输入
输出格式:
输出韩信至少拥有的士兵人数。
输入样例:
无输入
输出样例:
输出人数
代码:
tool = True
i = 11
while (tool):
i = i + 1
if (i % 5 == 1) and (i % 6 == 5) and (i % 7 == 4) and (i % 11 == 10):
print(i)
tool = False
'''
# 无脑版
"""
假设韩信最多有4千兵将
"""
for i in range(11, 4000, 1):
if (i % 5 == 1) and (i % 6 == 5) and (i % 7 == 4) and (i % 11 == 10):
print(i)
'''
7-9 求误差小于输入值的e的近似值
自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。ei代表前i项求和。输入误差范围error,当
,则表示e的近似值满足误差范围。
输入格式:
在一行输入误差范围。
输出格式:
在一行输出e的近似值(保留6位小数)。
输入样例1:
在这里给出一组输入。例如:
0.01
输出样例1:
在这里给出相应的输出。例如:
2.716667
输入样例2:
在这里给出一组输入。例如:
0.000000001
输出样例2:
在这里给出相应的输出。例如:
2.718282
代码:
'''
分母:Denominator
阶乘:Factorial
自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。ei代表前i项求和。输入误差范围error,当
ei+1-ei
'''
def Fact(a):
deno = 1
for i in range(1, a + 1, 1):
deno = deno * i
return deno
error = eval(input())
tool = True
num = 0
ei = 1 # 记录 ei+1
while (tool):
e = ei # 记录 ei
num = num + 1
ei = ei + 1 / Fact(num)
if ei - e < error: # 判断是否满足误差范围
tool = False
print("%.6f" % ei)
7-10 jmu-python-区间数之和
输入一个区间,计算里面能被3整除或被5整除的数和。
输入格式:
每行输入一个数据,代表区间左界和右界。数据必须是整数。
输出格式:
满足条件数和。
输入样例:
2
10
输出样例:
33
代码:
'''
能被三,或被5整除数之和
'''
begin = int(input())
end = int(input())
nums = 0
for i in range(begin, end + 1, 1):
if i % 5 == 0 or i % 3 == 0:
nums += i
print(nums)
7-11 企业根据利润提成发放奖金问题
企业根据利润提成发放奖金问题。利润低于或等于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%提成。从键盘输入当月利润,求应发放奖金总数?
输入格式:
输入一个利润整数。例如:输入120000。
输出格式:
输出一个实数。例如:11500.0。
输入样例:
在这里给出一组输入。例如:
120000
输出样例:
在这里给出相应的输出。例如:
11500.0
代码
'''
prifit:利润
bonus:奖金
注意:利润小于0时,奖金应为0
'''
profit = eval(input())
bonus_1 = 100000 * 0.1 # 10万元时
bonus_2 = (200000 - 100000) * 0.075 + bonus_1 # 20万元时
bonus_3 = (400000 - 200000) * 0.05 + bonus_2 # 40万时
bonus_4 = (600000 - 400000) * 0.03 + bonus_3 # 60万元时
bonus_5 = (1000000 - 600000) * 0.015 + bonus_4 # 100万元时
# bonus_6 = (profit - 1000000) * 0.01 + bonus_5 # 高于一百万时
if profit < 0:
print("0")
elif profit <= 100000:
bonus = profit * 0.1
print("%.1f" % bonus)
elif profit <= 200000:
bonus = (profit - 100000) * 0.075 + bonus_1
print("%.1f" % bonus)
elif profit <= 400000:
bonus = (profit - 200000) * 0.05 + bonus_2
print("%.1f" % bonus)
elif profit <= 600000:
bonus = (profit - 400000) * 0.03 + bonus_3
print("%.1f" % bonus)
elif profit <= 1000000:
bonus = (profit - 600000) * 0.015 + bonus_4
print("%.1f" % bonus)
else:
bonus = (profit - 1000000) * 0.01 + bonus_5
print("%.1f" % bonus)
7-12 求前n项的阶乘之和
从键盘输入一个整数n,求前n项的阶乘之和,1+2!+3!+...+n!的和
输入格式:
输入一个大于1的整数。例如:输入20。
输出格式:
输出一个整数。例如:2561327494111820313。
输入样例:
在这里给出一组输入。例如:
20
输出样例:
在这里给出相应的输出。例如:
2561327494111820313
代码:
'''
阶乘:Factorial
'''
def fact(a):
num = 1
for i in range(1, a + 1, 1):
num = num * i
return num
n = eval(input())
add = 0
for j in range(1, n + 1, 1):
add = add + fact(j)
print(add)
7-13 计算逆序的四位数
输入一个四位数,得到一个新的四位数。新数的千位数字、百位数字、十位数字和个位数字分别是原数的个位数、十位数、百位数和千位数。
输入格式:
输入一个四位数(假设输入必定是四位数,并且最后一位不为0)。
输出格式:
输出一个四位数。
输入样例:
在这里给出一组输入。例如: 1234
输出样例:
在这里给出相应的输出。例如:
4321
代码:
n1 = str(input()) # 输入原数字
n2 = ''
for i in range(0, 4, 1): # 可以拓展为n位数,利用len()函数
# print(type(n1[i]))
n2 = n2 + n1[3 - i]
print(n2)
期中测验
7-2 *号金字塔
输入金字塔层数,输出*号金字塔
输入格式:
输入一个正整数。
输出格式:
输出*号金字塔
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
*
***
*****
代码:
# *号金字塔
n = int(input())
for i in range(1,n+1,1):
for j in range(n,i,-1):
print(" ",end="")
for k in range(1,2*i,1):
print("*",end ="")
print("")
分析:
本体与 二-8.数字金字塔 类似,只是将数字的输出转变为*
7-3 计算两个日期间隔天数
输入两组同年的年月日,计算之间相隔天数。
其中,默认第二组输入日期比第一组输入日期大。例如,输入2018-3-1,2018-7-18,输出间隔天数140。提示输入的字符串转换为整数需要用到split()函数以及map()函数。"2018-3-1".split("-")的含义是将字符串按-切分,返回["2018","3","1"]列表。map(int,list)含义是将int函数依次应用于list中的每一个元素。
闰年的定义为被4整除且不能被100整除或被400整除的年份。
输入格式:
输入第一组年月日:2018-3-1
输入第二组年月日:2018-5-25
输出格式:
输出天数。
输入样例:
在这里给出一组输入。例如:
2018-3-1
2018-5-25
输出样例:
在这里给出相应的输出。例如:
86
代码:
# 计算两个日期间隔
def rn(year):
tool = 0
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
tool = 1
return tool
year1,month1,day1 = map(int,input().split("-")) # 日期1
year2,month2,day2 = map(int,input().split("-")) # 日期2
days = [0,31,28,31,30,31,30,31,31,30,31,30,31]
runnian = rn(year1)
adds1 = 0
adds2 = 0
if runnian == 0:
for i in range(1,month1,1):
adds1 = adds1 + days[i]
adds1 = adds1 + day1
for i in range(1,month2,1):
adds2 = adds2 + days[i]
adds2 = adds2 + day2
print(adds2 - adds1 + 1)
elif runnian == 1:
days[2] = 29
for i in range(1,month1,1):
adds1 = adds1 + days[i]
adds1 = adds1 + day1
for i in range(1,month2,1):
adds2 = adds2 + days[i]
adds2 = adds2 + day2
print(adds2 - adds1 + 1)
分析:
不足之处:
无法将计算不同年份之间的间隔日期;
日期的输入顺序无法颠倒
7-3 计算两个日期间隔天数PLUS
本题是对上一题的优化,弥补了上一题的不足之处
优点:
1.可以计算两个不同年份之间的日期
2.输入两个年份时,可以不按顺序输入
3.增加了判断年份相同时,而月份或日期不同时,可以不按顺序输入的判断
缺点:
1.代码量太繁琐
2.日期的交换以及计算等,应使用def定义函数模块来解决,可以增加代码的适配性
代码:
# 计算两个不同年份日期的天数
def rn(year):
tool = 0
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
tool = 1
return tool
year1, month1, day1 = map(int, input().split("-")) # 日期1
year2, month2, day2 = map(int, input().split("-")) # 日期2
days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
# 假如第一次输入的年份大于第二次输入的年份,将二者的数据进行交换
if (year1 > year2) or (year1 == year2 and month1 > month2) or (year1 == year2 and month1 == month2 and day1 > day2):
year_1 = year2
year_2 = year1
month_1 = month2
month_2 = month1
day_1 = day2
day_2 = day1
else:
year_1 = year1
year_2 = year2
month_1 = month1
month_2 = month2
day_1 = day1
day_2 = day2
# 判断是否是闰年
runnian_1 = rn(year_1)
runnian_2 = rn(year_2)
adds_1 = 0 # 记录year_1本年的日期数
adds_2 = 0 # 记录year_2本年的日期数
# 记录year_1本年的日期数
if runnian_1 == 0:
for i in range(1, month_1, 1):
adds_1 = adds_1 + days[i]
adds_1 = adds_1 + day_1
elif runnian_1 == 1:
days[2] = 29
for i in range(1, month_1, 1):
adds_1 = adds_1 + days[i]
adds_1 = adds_1 + day_1
# 记录year_2本年的日期数
if runnian_2 == 0:
for i in range(1, month_2, 1):
adds_2 = adds_2 + days[i]
adds_2 = adds_2 + day_2
elif runnian_2 == 1:
days[2] = 29
for i in range(1, month_2, 1):
adds_2 = adds_2 + days[i]
adds_2 = adds_2 + day_2
adds_3 = 0
# 记录year_1与year_2年份之间相差天数
for i in range(year_1, year_2, 1):
if rn(i) == 0:
adds_3 = adds_3 + 365
else:
adds_3 = adds_3 + 366
print(adds_2 - adds_1 + adds_3 + 1)
7-4 企业根据利润提成发放奖金问题