7-1 sdut-oop-2 Shift Dot(类和对象)
分数 10
作者 周雪芹
单位 山东理工大学
给出平面直角坐标系中的一点,并顺序给出n个向量,求该点根据给定的n个向量位移后的位置。
设计点类Point,内含:
(1)整型属性x和y,表示点的横坐标和纵坐标;
(2)带参构造方法,便于使用初始值构造该类对象;
(3)点移动的方法move(x1,y1),其 中x1和y1表示移动的向量,该方法返回移动后的新的点对象;
(4)展示点对象的字符串方法toString(),以“(横坐标,纵坐标)”的形式。
输入格式:
多组输入。
第一行是三个整数x,y,n,表示点的坐标(x,y),和向量的个数n。
接下来n行,每行两个数xi,yi,表示第i个向量。
题目中所有数据不会超出整型范围。
输出格式:
对于每组输入,输出一行,形式为:“(x,y)”,表示点的最终点位置的横坐标和纵坐标。
输入样例:
0 0 1
2 3
0 0 2
1 2
2 3
while True:
try:
a,b,c=map(int,input().split(' '))
for i in range(0,c):
x,y=map(int,input().split(' '))
a,b=a+x,b+y
print("("+str(a)+","+str(b)+")")
except:
break
7-2 sdut-Time类的定义与使用
分数 10
作者 周雪芹
单位 山东理工大学
设计一个时间类Time。它拥有:
私有数据成员:hour(时)、minute(分)、second(秒);
公开的成员函数:
setHour(int)设置数据成员hour的值(采用12小时制),非法的输入默认为12;
setMinue(int)设置数据成员minute的值,非法输入默认为0;
setSecond(int)设置数据成员second的值,非法输入默认为0;
setTime(int,int,int)设置时、分、秒三个数据成员的值;
showTime()显示时间对象的值。
在主函数main()中调用相应成员函数,使得时间对象的值能从键盘接收,并正确显示。
a, b, c = map(int, input().split())
if a>12:
print("12",end=':')
else:
print(a,end=":")
if b>60:
print("00",end=':')
else:
print(b,end=":")
if c>60:
print("00",end='')
else:
print(c,end="")
7-3 sdut-谁是最强的女汉子
分数 10
作者 周雪芹
单位 山东理工大学
众所周知,一年一度的女汉子大赛又来啦。由于最近女汉子比较流行,所以参加女汉子比赛的人数变得很多很多。所以赛事组找来了你,让你写一个程序找出谁是最强的女汉子。
大家都知道,越是不漂亮的女生就越容易成为女汉子(漂亮的怎么会成为汉子?),而越是力量大的女生也越成为女汉子(毕竟女汉子还是比较有力量的)。
所以,就给女汉子两个属性,一个是漂亮值x,一个是力量值y。当然x的值越大,就代表这个女生就越漂亮。现在想让你求出来最不漂亮的女生有多少个,她们的力量和是多少。
t=int(input())
minn,s,ss=10000,0,0
for i in range(t):
x,y=map(int,input().split())
if x<minn:
s=y
ss=1
minn=x
elif x==minn:
s+=y
ss+=1
print(ss,s)
7-4 sdut-oop-5 计算长方体和四棱锥的表面积和体积(类的继承)
分数 10
作者 周雪芹
单位 山东理工大学
计算如下立体图形的表面积和体积。
import math
while True:
try:
l,h,z = map(float, input().split())
if (l <= 0 or h <= 0 or z <= 0):
print("0.00 0.00 0.00 0.00")
else :
print("%.2f %.2f %.2f %.2f"%(2*(l*h+l*z+z*h),z*h*l,h*l+math.sqrt((h/2)**2+z*z)*l+math.sqrt((l/2)**2+z*z)*h,1/3*l*h*z))
except:
break
7-5 sdut-oop-6 计算各种图形的周长(多态)
ss.count(" ")
分数 10
作者 周雪芹
单位 山东理工大学
定义接口或类 Shape,定义求周长的方法length()。
定义如下类,实现接口Shape或父类Shape的方法。
(1)三角形类Triangle (2)长方形类Rectangle (3)圆形类Circle等。
定义测试类ShapeTest,用Shape接口(或类)定义变量shape,用其指向不同类形的对象,输出各种图形的周长。并为其他的Shape接口实现类提供良好的扩展性。
提示: 计算圆周长时PI取3.14。
while True:
try:
ss=input()
PI=3.14
if ss.count(" ")==0:
if int(ss)<=0:
print("0.00")
else:
print("%.2f"%(2*PI*int(ss)))
elif ss.count(" ")==1:
m,n=map(float,ss.split())
if m<=0 or n<=0:
print("0.00")
else:
print("%.2f"%(2*(m+n)))
else:
m,n,r=map(float,ss.split())
if m+n>r and m+r>n and n+r>m:
if m<=0 or n<=0 or r<=0:
print("0.00")
else:
print("%.2f"%(m+n+r))
else :
print("0.00")
except:
break
7-6 sdut-oop-9 计算长方形的周长和面积(类和对象)
分数 10
作者 周雪芹
单位 山东理工大学
设计一个长方形类Rect,计算长方形的周长与面积。
成员变量:整型、私有的数据成员length(长)、width(宽);
构造方法如下:
(1)Rect(int length) —— 1个整数表示正方形的边长
(2)Rect(int length, int width)——2个整数分别表示长方形长和宽
成员方法:包含求面积和周长。(可适当添加其他方法)
要求:编写主函数,对Rect类进行
while True:
try:
ss=input()
if ss.count(" ")==0:
ss=int(ss)
if ss<=0:
ss=0
print("%d %d %d %d"%(ss,ss,4*ss,ss**2))
else:
m,n=map(int,ss.split())
if m<=0 or n<=0:
m,n=0,0
print("%d %d %d %d"%(m,n,2*(m+n),m*n))
except:
break
7-1 sdut-分数的化简
from fractions import Fraction
print(Fraction(n,m))
分数 10
作者 周雪芹
单位 山东理工大学
输入一个分数,对该分数化简后输出其最简分式的形式。
输入格式:
输入有若干行,每行输入一个分数。
输出格式:
对每行输入,输出其真最简分式的形式。
from fractions import Fraction
while True:
try:
n,m=map(int,input().split('/'))
print(Fraction(n,m))
except:
break
7-2 sdut-oop-8 分数四则运算(类和对象)
分数 10
作者 周雪芹
单位 山东理工大学
定义类Fraction,在其中定义属性:numerator和denominator,分别表示分子和分母。
然定再定义两个分数的加、减、乘、除运算的方法。
在主类中输入2个分数,计算它们的四则运算结果。
提示:若用Python语言来实现,不必自行创建类,可直接使用 fractions模块处理分数的表示与运算。
from fractions import Fraction
for i in range(int(input())):
ss=input()
x,y='',''
cnt=0
for i in ss:
if i!='+' and i!='-' and i!='*' and i!='\\':
x+=i
else:
y=ss[cnt+1:len(ss)]
if i=='+':
print(Fraction(x)+Fraction(y))
elif i=='-':
print(Fraction(x)-Fraction(y))
elif i=='*':
print(Fraction(x)*Fraction(y))
else:
print(Fraction(x)/Fraction(y))
cnt+=1
7-3 sdut-分数加减法
分数 10
作者 周雪芹
单位 山东理工大学
编写一个程序,实现两个分数的加减法。
输入格式:
输入包含多行数据。
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+“或者”-"。
输出格式:
对于输入数据的每一行输出两个分数的运算结果。
注意:结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数。
from fractions import Fraction
while True:
try:
ss=input()
x,y='',''
cnt=0
for i in ss:
if i!='+' and i!='-': #记得\\,否则EOF
x+=i
else:
y=ss[cnt+1:len(ss)]
if i=='+':
print(Fraction(x)+Fraction(y))
else:
print(Fraction(x)-Fraction(y))
cnt+=1
except:
break
7-5 sdut-验证“哥德巴赫猜想”
分数 10
作者 周雪芹
单位 山东理工大学
著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。
输入格式:
在一行中,给出一个(2, 2 000 000 000]范围内的偶数N。
输出格式:
在一行中,按照格式“N=p+q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如:24还可以分解为7+17),要求必须输出所有解中p最小的解。
import math
def isP(n):
for i in range(2,int(math.sqrt(n))+1):
if n%i==0:
return False
return True
n=int(input())
for i in range(2,n-1):
if isP(i) and isP(n-i):
print("%d=%d+%d"%(n,i,n-i))
break
7-6 sdut-学生互助组队
down=stu[n-1:n//2-1:-1]
down.remove(j) #删除元素j
分数 10
作者 周雪芹
单位 山东理工大学
“一对一学习互助小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。
请你编写程序帮助老师完成这个分配工作,即:在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
第一行给出正偶数N(≤50),即全班学生的人数。
此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),以1个空格分隔。
n=int(input()) #全班学生的人数。
stu=[]
for i in range(n): #此后N行
stu.append(list(input().split())) #,按照名次从高到低的顺序给出每个学生的性别和姓名
#名次前半段的学生
up=stu[:n//2] #不包含下标为n//2的第n//2+1位
#名次总最低到最高的后半段的学生的性别
down=stu[n-1:n//2-1:-1] #不包含下标为n//2-1的第n//2位
for i in up:
for j in down:
if i[0]!=j[0]: #异性
print(i[1],j[1])
down.remove(j) #删除元素j
break
7-7 sdut-求指定层的元素个数
分数 10
作者 周雪芹
单位 山东理工大学
输入一个嵌套列表,再输入层数,求该层的元素个数。
输入格式:
第一行输入列表,第二行输入层数。
输出格式:
在一行中输出元素个数。
def f(n,lst):
for i in lst:
res[n]+=1
if type(i)==list:
f(n+1,i)
lst=eval(input())
n=int(input())
res=[0,0,0,0,0,0]
f(1,lst)
print(res[n])
7-3 sdut-求误差小于输入值的e的近似值
while 1/math.factorial(i)>=n:
分数 10
作者 周雪芹
单位 山东理工大学
自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。ei代表前i项求和。输入误差范围error,当
99.jpg,则表示e的近似值满足误差范围。
输入格式:
在一行输入误差范围,误差小于等于0.01。
输出格式:
在一行输出e的近似值(保留6位小数)。
输入样例1:
0.01
输出样例1:
2.716667
import math
n=float(input())
s=0
i=0
while 1/math.factorial(i)>=n:
s+=1/math.factorial(i)
i+=1
s+=1/math.factorial(i)
print("%.6f"%(s))
7-8 sdut-入门-4 A+B for Input-Output Practice (IV)
分数 10
作者 周雪芹
单位 山东理工大学
你的任务是计算一些整数的和。
输入格式:
输入包含多个测试用例。
每个测试用例包含一个整数N,然后在同一行中跟随N个整数。以0开始的测试用例终止输入,并且这个测试用例不被处理。
输出格式:
对于每一组输入整数,您应该在一行中输出它们的和,输入的每一行都有一行输出。
输入样例:
while True:
num=list(map(int,input().split()))
if num[0]==0:
break
else:
print(sum(num)-num[0])
7-18 sdut-水仙花数
分数 10
作者 周雪芹
单位 山东理工大学
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。
请计算所有N位水仙花数。
输入格式:
在一行内,给出一个正整数N(3≤N≤5)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
n=int(input())
for i in range(10**(n-1),10**n-1):
s=0
for j in str(i):
s+=int(j)**n
if s==i:
print(s)
7-19 sdut-最大公约数和最小公倍数
分数 10
作者 周雪芹
单位 山东理工大学
给定2个正整数,求它们的最大公约数和最小公倍数,并输出。
输入格式:
输入有若干组。
每组数据,在一行中给出两个正整数M和N(≤1000),中间有1个空格。
输出格式:
对于每组输入,在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1个空格分隔。
import math
while True:
try:
m,n=map(int,input().split())
gcd=math.gcd(m,n)
lcm=m*n//gcd #必须要整除,或者化为整数
print(gcd,lcm)
except:
break
7-22 sdut-冒泡排序中数据交换的次数
range(n-i-1):
分数 10
作者 周雪芹
单位 山东理工大学
听说过冒泡排序么?一种很暴力的排序方法。今天我们不希望你用它来排序,而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。
输入格式:
第一行为一个正整数 T ,表示有 T 组测试数据。
接下来T行,每行第一个整数N, 然后有N个整数,无序。0<N <= 100。
t=int(input())
for k in range(t):
lst=list(map(int,input().split()))
n=lst[0]
lst=lst[1:]
num=0
for i in range(n):
for j in range(n-i-1):
if lst[j]>lst[j+1]:
lst[j],lst[j+1]=lst[j+1],lst[j]
num+=1
print(num)
7-2 sdut-字符之比较大小
***lst[i]=chr(lst[i])
print(lst,sep=“<”)**
分数 10
作者 周雪芹
单位 山东理工大学
输入3个不同整数,这3个整数分别对应3个字母的ASCII码值,把这3个字母按它的ASCII码值从小到大输出。
输入格式:
输入在一行中给出3个整数,其间以空格分隔。
输出格式:
在一行中将3个字母按ASCII码值从小到大输出,其间以“<”相连。
lst=sorted(list(map(int,input().split())))
for i in range(3):
lst[i]=chr(lst[i])
print(*lst,sep="<")
7-3 sdut-判断回文字符串
if res[i]!=res[len(res)-i-1]:
分数 10
作者 周雪芹
单位 山东理工大学
回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的。
输入一个字符串,判断该字符串是否为回文,只考虑数字和字母字符,字母的大小写没有区别。
输入格式:输入一个字符串。
输出格式:
判断字符串是否为回文,若是,则在一行内输出yes,否则输出no。
`str=input()
res=''
for i in str:
if i.isalnum():
if i.isupper():
i=i.lower()
res+=i
isre=0
for i in range(len(res)):
if res[i]!=res[len(res)-i-1]:
isre=1
break
if isre==0:
print("yes")
else:
print("no")
7-4 sdut-删除字符
str=input().strip()
ch=input().strip()
分数 10
作者 周雪芹
单位 山东理工大学
输入一个字符串 str,和要删除字符 c,将字符串 str 中出现的所有字符 c (不区分大小写)删除。
提示:去掉输入的字符串或字符两端的空格。
输入格式:
第一行中输入一行字符串str;
第二行输入待删除的字符 c。
输出格式:
在一行内输出删除指定字符c后的字符串。形式为:result:
str=input().strip()
ch=input().strip()
ss=''
for i in str:
if i not in [ch.lower(),ch.upper()]:
ss+=i
print("result: "+ss)
7-6 sdut-输出字符串中最大字符及其索引位置
rfind(str[-1])
分数 10
作者 周雪芹
单位 山东理工大学
输入字符串,排序后输出最大字符及该字符在原字符串中的索引。
相同字符的索引取最大值。
输入格式:
一行输入字符串。
输出格式:
在一行内输出最大字符及其最大索引位置。字符和数字间有3个空格。
输入样例1:
Hello Python
输出样例1:
y 7
输入样例2:
HELLO EVERYONE YEAR 2021
输出样例2:
Y 15
s=input()
str=sorted(list(s))
index=s.rfind(str[-1])
print(str[-1]+" ",index)
7-9 sdut-整数的二进制相加
分数 10
作者 周雪芹
单位 山东理工大学
输入两个整数,大小在[0,63]之间。求它们的和,对二进制形式展示数据。
二进制用8位表示。
输入格式:
在一行输入一个十进制整数,在第二行输入另一个十进制整数。
输出格式:
求它们和,并输出数据的二进制形式。
ten1=int(input())
ten2=int(input())
print("{:>08s}".format(bin(ten1)[2:]))
print("{:>08s}".format(bin(ten2)[2:]))
print("-"*8)
print("{:>08s}".format(bin(ten1+ten2)[2:]))
7-10 sdut-汉明距离
x=“{:>032s}”.format(bin(x)[2:])
y=“{:>032s}”.format(bin(y)[2:])
print(sum(a!=b for a,b in zip(x,y)))
分数 10
作者 周雪芹
单位 山东理工大学
两个整数间的汉明距离指的是这两个数对应二进制位不同的位置的数目。
输入两个整数x,y, 0<=x,y<=2
31
。输出x,y的汉明距离。
输入格式:
在一行输入x,y;中间有一个空格。
输出格式:
在一行内 输出x与y的汉明距离。
x,y=map(int,input().split())
x="{:>032s}".format(bin(x)[2:])
y="{:>032s}".format(bin(y)[2:])
a,b='',''
print(sum(a!=b for a,b in zip(x,y)))
7-11 sdut-输出一个字符串的字符的16-10-8-2进制数
分数 10
作者 周雪芹
单位 山东理工大学
输入一行字符串,去掉非16进制字符,将它转换成16、10、8、2进制数,输出。
输入格式:
输入一行字符串。
输出格式:
输出转换后的16、10、8、2进制数。数据之间有1个空格。(16进制字母小写)
ss=input()
res=''
for i in ss:
if 'a'<=i<='f' or 'A'<=i<='F' or '0'<=i<='9':
res+=i
ten=int(res,16)
six=hex(ten)[2:]
eig=oct(ten)[2:]
two=bin(ten)[2:]
print(six,ten,eig,two)
7-6 sdut-字母替换
分数 10
作者 周雪芹
单位 山东理工大学
编写程序,将输入字符串中的大写英文字母按以下对应规则替换,其他字符不变。
(Python实现提示:转换表用元组实现)
lst=input()
for i in lst:
if i.isupper():
i=chr(90-(ord(i)-65))
print(i,end='')
7-8 sdut- 输出10个不重复的英文字母
分数 10
作者 周雪芹
单位 山东理工大学
输入一个字符串,把最左边的10个不重复的英文字母(不区分大小写)挑选出来进行输出
如没有10个英文字母,显示信息“not found”。
输入格式:
在一行中输入字符串。
输出格式:
在一行中输出最左边的10个不重复的英文字母;或者显示信
ss=input()
res=''
for i in ss:
if i.isalpha() and i.upper() not in res and i.lower() not in res:
res+=i
if len(res)<10:
print("not found")
else:
print(res[:10]) #不要忘记只保留前十个的切片
7-10 sdut-猴子选大王
n=int(input())
p=0
for i in range(2,n+1):
p=(p+3)%i
print(p+1)
-14 sdut-判断上、下三角矩阵
分数 10
作者 周雪芹
单位 山东理工大学
给定一个三角矩阵,判断其是否为:上三角矩阵、下三角矩阵。
上三角矩阵指主对角线以下的元素都为0的矩阵;
下三角矩阵指主对角线以上的元素都为0的矩阵;
主对角线为从矩阵的左上角至右下角的连线。
输入矩阵是三种情况之一:上三角矩阵、下三角矩阵或者都不是。
t=int(input())
while t:
t-=1
isup=0
islow=0
n=int(input())
for i in range(n):
lst=list(map(int,input().split()))
if i and sum(lst[:i])!=0:
isup=1
elif i<n-1 and sum(lst[i+1:])!=0:
islow=1
elif isup==1 and islow==1:
break
if isup==0:
print("upper")
elif islow==0:
print("lower")
else:
print("no")
-20 sdut- 矩阵转置(II)
分数 10
作者 周雪芹
单位 山东理工大学
从键盘输入一个m(2<=m<=6)*n(2<=n<=6)阶的矩阵,编程输出它的转置矩阵。
输入格式:
在第一行输入矩阵的行数m和列数n的值;
在第二行按照矩阵格式输入矩阵的数据,同行数据之间用空格隔开。
输出格式:
矩阵格式输出,同行数据之间用一个空格隔开。
m,n=map(int,input().split())
lst=[[0 for i in range(6)] for i in range(6)] #初始化时要是6
for i in range(m):
lst[i]=list(map(int,input().split()))
for i in range(n):
isfir=0
for j in range(m):
if isfir==0:
print(lst[j][i],end='')
isfir=1 #不要忘记变成1
else:
print('',lst[j][i],end='')
print()
7-3 sdut-图的字典表示
分数 10
作者 周雪芹
单位 山东理工大学
现在用PYTHON的数据结构表示图。图中有若干个顶点,每个顶点的表示方式为:顶点名称和该顶点相连的所有的其他顶点的名称,所组成的边的长度。
n=int(input())
num,long=0,0
for i in range(n):
dic=eval(input())
for j in dic:
dic2=dic[j]
for k in dic2:
num+=1
long+=dic2[k]
print(n,num,long)
7-9 sdut-字典合并
分数 10
作者 周雪芹
单位 山东理工大学
输入用字符串表示两个字典,输出合并后的字典。字典的键用一个字母或数字表示。
注意:1和‘1’是不同的关键字!
输入格式:
在第一行中输入第一个字典字符串;
在第二行中输入第二个字典字符串。
输出格式:
在一行中输出合并的字典,输出按字典序。
n=eval(input())
m=eval(input())
l=list()
l1=list()
l2=list()
for i in m:
if i in n :
n[i]=n[i]+m[i]
else:
n[i]=m[i]
for i in n:
if(type(i)==str):
l2.append(ord(i))
l.append(ord(i))
else:
l1.append(i)
l.append(i)
l=sorted(l)
for i in l:
if i in l1:
print("%d:%d"%(i,n[i]))
else:
print("'%s':%d"%(chr(i),n[chr(i)]))
7-15 sdut-查字典
分数 10
作者 周雪芹
单位 山东理工大学
遇到单词不认识怎么办? 查字典啊!
已知字典中有n个单词,现有m个不认识的单词,询问这m个单词是否出现在字典中,如果在字典中就输出其含义,如果不在字典中,就输出:Not found!
while True:
n,m=map(int,input().split()) #字典中存在的n个单词,和要查询的m个单词.
if m==n==0: #结束条件若n=0&&m=0 程序结束
break
#初始化
dic={}
for i in range(n): #紧跟着n行
key,val=map(str,input().split(":")) #输入
dic[key]=val #加入字典
for i in range(m): #要查询的m个单词。
find=input() #本次要查询的m个单词。
if find in dic: #若在字典中存在
print(dic[find])
else:
print("Not found!")
7-6 sdut-学生互助组队
分数 10
作者 周雪芹
单位 山东理工大学
“一对一学习互助小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。
请你编写程序帮助老师完成这个分配工作,即:在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
第一行给出正偶数N(≤50),即全班学生的人数。
此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),以1个空格分隔。
这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。
名次高的学生在前,名次低的学生在后。
小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
n=int(input()) #全班学生的人数。
stu=[]
for i in range(n): #此后N行
stu.append(list(input().split())) #,按照名次从高到低的顺序给出每个学生的性别和姓名
#名次前半段的学生
up=stu[:n//2] #不包含下标为n//2的第n//2+1位
#名次总最低到最高的后半段的学生的性别
down=stu[n-1:n//2-1:-1] #不包含下标为n//2-1的第n//2位
for i in up:
for j in down:
if i[0]!=j[0]: #异性
print(i[1],j[1])
down.remove(j) #删除元素j
break