西北工业大学NOJ-Python程序设计作业题解集合:
NOJ-Python程序设计:第1季:水题(Season 1-Easy) (1-10)
NOJ-Python程序设计:第2季:小段代码(Season 2-Snippet) (11-20)
NOJ-Python程序设计:第3季:循环(Season 3-Loop) (21-30)
NOJ-Python程序设计:第4季:枚举算法(Season 4-Enumeration algorithm) (31-40)
NOJ-Python程序设计:第5季:模块化(Season 5-Modularization) (41-50)
NOJ-Python程序设计:第6季:字符串(Season 6-String) (51-60)
NOJ-Python程序设计:第7季:列表与元组(Season 7-List and Tuple) (61-70)
NOJ-Python程序设计:第8季:集合与字典(Season 8-Sets and Dictionary) (71-80)
NOJ-Python程序设计:第9季:类(Season 9-Class) (81-90)
NOJ-Python程序设计:第10季:挑战算法(Season 10-Challenges) (91-100)
第9季:类(Season 9-Class)(81-90)
前置知识点
这部分主要是运用前面的知识来实现相关的类,没有前置知识点。这部分题目比较简单,主要考察算法思路和代码规范。
圆类
import math
class Circle:
def __init__(self,r):
self.r=r
self.PI=3.14
def area(self):
return self.r*self.r*self.PI
def perimeter(self):
return self.r*2*self.PI
pass
r=float(input())
c=Circle(r)
print(c.area(),c.perimeter())
# Code By Phoenix_ZH
闭合括号
其实我认为这个题有个地方没说清楚:({)}算True吗?其实按照题意我感觉是True.但是似乎改题目数据认为它是False.这个地方我不确定。我写的程序认为({)}为False.
class Close:
def __init__(self,s):
self.s=s
def isLegal(self):
a=[]
for i in range(len(self.s)):
s=self.s
if(s[i] in ('(','[','{')):
a.append(s[i])
else:
if(len(a)==0 or (s[i]==')' and a[len(a)-1]!='(')):
return False
if(len(a)==0 or (s[i]==']' and a[len(a)-1]!='[')):
return False
if(len(a)==0 or (s[i]=='}' and a[len(a)-1]!='{')):
return False
a.pop()
if(len(a)):
return False
return True
pass
while(1):
s=input()
if(s==''):
break
c=Close(s)
print(c.isLegal())
# Code By Phoenix_ZH
反向字符串
将字符列表翻转然后构成一个字符串。
class Reverse_string:
def __init__(self,s):
self.s=s
def reverse(self):
l=self.s.split()
l.reverse()
s=' '.join(l)
return s
s=input()
ss=Reverse_string(s)
print(ss.reverse())
# Code By Phoenix_ZH
矩形类
class Rectangle:
def __init__(self,l,w):
self.l,self.w=l,w
def area(self):
return self.l*self.w
pass
l,w=map(int,input().split())
a=Rectangle(l, w)
print(a.area())
# Code By Phoenix_ZH
Pow方法
指数如果小于0,可以先求指数为整数时的值,最后取倒数。
class Pow:
def __init__(self,x,n):
self.x,self.n=x,n
def pow(self):
ans=1
for i in range(abs(self.n)):
ans=ans*self.x
if(n<0):
ans=1/ans
return ans
pass
x,n=map(int,input().split())
q=Pow(x,n)
print(q.pow())
# Code By Phoenix_ZH
特定目标
直接枚举第一个数字和第二个数字判断和是否等于n。
class Match:
def __init__(self,l,n):
self.l,self.n=l,n
def match(self):
ans=[0,'+',0,'=',self.n]
for i in range(len(self.l)):
for j in range(i+1,len(self.l)):
if(self.l[i]+self.l[j]==self.n):
ans[0],ans[2]=self.l[i],self.l[j]
ans=list(map(str,ans))
return ' '.join(ans)
pass
l=list(map(int,input().split()))
n=int(input())
a=Match(l, n)
print(a.match())
# Code By Phoenix_ZH
和为零
我的代码和样例不一样: 第一个样例是[-25,10,15],而我的是[-25,15,10],按照题意来应该我的才是对的.我不清楚OJ是否有Special Judge,最好按照要求来,样例可能是错的。
枚举第一个数字、第二个数字、第三个数字(保证顺序 i < j < k i<j<k i<j<k),一旦和为0则加入列表。
class Zero:
def __init__(self,l):
self.l=l
def match_zero(self):
ans=[]
for i in range(len(self.l)):
for j in range(i+1,len(self.l)):
for k in range(j+1,len(self.l)):
if(self.l[i]+self.l[j]+self.l[k]==0):
b=[self.l[i],self.l[j],self.l[k]]
ans.append(b)
return ans
pass
l=list(map(int,input().split()))
a=Zero(l)
print(a.match_zero())
# Code By Phoenix_ZH
罗马数字Ⅱ
创建一个字典,然后根据III:30; IV:40可以发现规律如果 a [ s [ i ] ] < a [ s [ i + 1 ] ] a[s[i]]<a[s[i+1]] a[s[i]]<a[s[i+1]]那么就需要先让 a n s − = a [ s [ i ] ] ans-=a[s[i]] ans−=a[s[i]],后面会再加上 a [ s [ i + 1 ] ] a[s[i+1]] a[s[i+1]];其余情况直接 a n s + = a [ s [ i ] ] ans+=a[s[i]] ans+=a[s[i]]即可。
class Roman_to_Int:
def __init__(self,s):
self.s=s
def roman_to_int(self):
a={'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
ans=0
for i in range(len(self.s)-1):
if(a[self.s[i]]<a[self.s[i+1]]):
ans-=a[self.s[i]]
else:
ans+=a[self.s[i]]
ans+=a[self.s[len(self.s)-1]]
return ans
pass
s=input()
a=Roman_to_Int(s)
print(a.roman_to_int())
# Code By Phoenix_ZH
罗马数字Ⅰ
创建千位、百位、十位、个位的数字列表,然后再加入列表d中,直接根据传入的整数的每一位数字来选择对应的字符。
class Int_to_Roman:
def __init__(self,n):
self.n=n
def int_to_roman(self):
s=list(self.n)
s.reverse()
Thousands=['M','MM','MMM']
Hundreds=['C','CC','CCC','CD','D','DC','DCC','DCCC','CM']
Tens=['X','XX','XXX','XL','L','LX','LXX','LXXX','XC']
Units=['I','II','III','IV','V','VI','VII','VIII','IX']
d=[]
d.append(Units)
d.append(Tens)
d.append(Hundreds)
d.append(Thousands)
ans=''
for i in range(len(s)-1,-1,-1):
ans=ans+d[i][int(s[i])-1]
return ans
pass
n=input()
a=Int_to_Roman(n)
print(a.int_to_roman())
# Code By Phoenix_ZH
唯一子集
这题需要考虑状态压缩:由于数据保证了各不相同,所以只需要将输入从大到小排序,然后观察样例,输入会变成6 5 4,输出其实就是按照选择0,10,11,100,101,110,111 这样的方式来排列的,枚举二进制数进行匹配即可
class SonSet:
def __init__(self,l):
self.l=l
def sonset(self):
ans=[]
for x in range((1<<len(self.l))):
a=[]
for i in range(len(self.l)):
if(x&(1<<i)):
a.append(self.l[i])
a.sort()
ans.append(a)
return ans
l=list(map(int,input().split()))
l.sort(reverse=True)
q=SonSet(l)
print(q.sonset())
# Code By Phoenix_ZH