编程语言
首页 > 编程语言> > 西北工业大学NOJ-Python程序设计作业81-90

西北工业大学NOJ-Python程序设计作业81-90

作者:互联网

西北工业大学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)

img

前置知识点

这部分主要是运用前面的知识来实现相关的类,没有前置知识点。这部分题目比较简单,主要考察算法思路和代码规范。

圆类

img

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

闭合括号

img

其实我认为这个题有个地方没说清楚:({)}算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

反向字符串

img

将字符列表翻转然后构成一个字符串。

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

矩形类

img

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方法

img

指数如果小于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

特定目标

img

直接枚举第一个数字和第二个数字判断和是否等于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

和为零

img

我的代码和样例不一样: 第一个样例是[-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

罗马数字Ⅱ

img

创建一个字典,然后根据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

罗马数字Ⅰ

img

创建千位、百位、十位、个位的数字列表,然后再加入列表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

唯一子集

img

这题需要考虑状态压缩:由于数据保证了各不相同,所以只需要将输入从大到小排序,然后观察样例,输入会变成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

标签:__,return,NOJ,Python,self,len,西北工业大学,ans,def
来源: https://blog.csdn.net/Phoenix_ZengHao/article/details/122586767