西北工业大学NOJ-Python程序设计作业41-50

各位同学,创作不易,能否在文末打赏一瓶饮料呢?(^ _ ^)(文章末尾右下角处)
在这里插入图片描述

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

第5季:模块化(Season 5-Modularization)(41-50)

西北工业大学NOJ-Python程序设计作业41-50_第1张图片

前置知识点

建议大概了解下述函数库的基本运用之后再完成题目会更顺利。

列表:

  • 可以使用append()方法来添加列表项:a.append('b')(a是列表)
  • 删除列表元素:del a[0]或者del a[0:2](删除[0,2))
  • 转换列表元素类型:比如a[]中都是int,需要转换成str,则a=map(str,a)
  • 输出列表的元素:print(','.join(a))(中间用’,'分割,并且a中元素的类型是str)。注意它和print(a)的输出的结果是不同的

霍夫斯塔德序列

西北工业大学NOJ-Python程序设计作业41-50_第2张图片

def F(n):
    if(n==0):
        return 1
    return n-M(F(n-1))

def M(n):
    if(n==0):
        return 0
    return n-F(M(n-1))

n=int(input())
print(F(n),M(n))
# Code By Phoenix_ZH

Collatz conjecture

西北工业大学NOJ-Python程序设计作业41-50_第3张图片

def Collatz_conjecture(n):
    a.append(n)
    if(n==1):
        return
    if(n%2):
        n=n*3+1
        Collatz_conjecture(n)
    else:
        n//=2
        Collatz_conjecture(n)
a=[]
n=int(input())
Collatz_conjecture(n)
a=map(str,a)
print(','.join(a))
# Code By Phoenix_ZH

佩尔数

西北工业大学NOJ-Python程序设计作业41-50_第4张图片

def P(n):
    if(n==0):
        return 0
    elif(n==1):
        return 1
    else:
        return 2*P(n-1)+P(n-2)

n=int(input())
print(P(n))
# Code By Phoenix_ZH

扩展欧几里得算法

西北工业大学NOJ-Python程序设计作业41-50_第5张图片

可以参考:https://oi-wiki.org/math/number-theory/bezouts/

import math
def exgcd(a,b):
    if(b==0):
        return 1,0,a
    else:
        x,y,q=exgcd(b,a%b)
        x,y=y,(x-(a//b)*y)
        return x,y,q
n,m=map(int,input().split())
x,y,q=exgcd(n, m)
print(x,y)
# Code By Phoenix_ZH

卡塔兰数

西北工业大学NOJ-Python程序设计作业41-50_第6张图片

def Catalan(n):
    ans=1
    for k in range(2,n+1):
        ans=ans*(n+k)
    for k in range(2,n+1):
        ans=ans//k
    return ans
n=int(input())
print(int(Catalan(n)))
# Code By Phoenix_ZH

分解因数

西北工业大学NOJ-Python程序设计作业41-50_第7张图片

递归的时候注意参数 ( n , m ) (n,m) (n,m)表示:当前数是n,设定当前判断因数m。边界条件为n=1或者m=1,如果m是n的因数,那么就可以累加方案数Defactor(n//m,m),Defactor函数返回方案数

def Defactor(n,m):
    if(n==1):
        return 1
    if(m==1):
        return 0
    ans=Defactor(n,m-1)
    if(n%m==0):
        ans+=Defactor(n//m,m)
    return ans
       
a=int(input())
print(Defactor(a,a))
# Code By Phoenix_ZH

分苹果

西北工业大学NOJ-Python程序设计作业41-50_第8张图片

  • 如果盘子过多 必然有n-m个盘子空的 ,那么Divide(m,n)=Divide(m,m)。
  • 否则就是,那么有一个盘子为空,然后继续求解Divide(m,n-1);那么就都不为空(每个盘子至少一个苹果)然后继续求解Divide(m-n,n)
def Divide(m,n):#m apples ;n plates
    if(m==0 or n==1):
        return 1
    if(n>m):#盘子过多 必然有n-m个盘子空的 
        return Divide(m, m)
    else:
        return Divide(m,n-1)+Divide(m-n,n)

m,n=map(int,input().split())
print(Divide(m,n))
# Code By Phoenix_ZH

非负累加

西北工业大学NOJ-Python程序设计作业41-50_第9张图片

def dfs(t,w,v):
    if(t==n+1):
        return (w==v)
    ans=0
    for i in range(0,v-w+1):
        ans+=dfs(t+1,w+i,v)
    return ans
    pass

n,v=map(int,input().split())
print(dfs(1,0,v))
# Code By Phoenix_ZH

倒序二进制

西北工业大学NOJ-Python程序设计作业41-50_第10张图片

def BinInverted(n):
    return ''.join(reversed('{:b}'.format(n)))
n=int(input())
print(BinInverted(n))
# Code By Phoenix_ZH

有效运动

西北工业大学NOJ-Python程序设计作业41-50_第11张图片

def dfs(x,y,x2,y2):
    if(x>x2 or y>y2):
        return 0
    if(x==x2 and y==y2):
        return 1
    return dfs(x+y,y,x2,y2)|dfs(x,x+y,x2,y2)
    pass

x1,y1,x2,y2=map(int,input().split())
if(dfs(x1,y1,x2,y2)):
    print("true")
else:
    print("false")
# Code By Phoenix_ZH

你可能感兴趣的:(python,算法)