西北工业大学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)
这部分主要是运用前面的知识来实现相关的类,没有前置知识点。这部分题目比较简单,主要考察算法思路和代码规范。
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
指数如果小于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