【Educoder作业】问题求解——函数运用

【Educoder作业】问题求解——函数运用

T1 天数计算

判断闰年其实很简单,要么是 400 400 400的倍数,要么是 4 4 4的倍数但是不是 100 100 100的倍数,一行就可以实现。除此之外我们设置一个月份数组,这样在求和的时候会方便很多。

########## Begin ##########
M = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] # M[i - 1] -> ith month
def dayOfYear(y, m, d) :
    if y % 400 == 0 or (y % 100 != 0 and y % 4 == 0) :
        M[1] += 1
    mdl = 0
    for i in range(m - 1) :
        mdl += M[i]
    return mdl + d
########## End ##########
y = int(input())    #年
m = int(input())    #月
d = int(input())    #日
day = dayOfYear(y,m,d)
print('%d年%d月%d日是这年第%d天' % (y,m,d,day))

T2 打印圣诞树

这个题比较有趣,我们定义一个 O u t p u t ( x ) Output(x) Output(x)函数,表示这一样打印 x x x ∗ * ,实现是容易的。之后的圣诞树就循环一下就好。

########## Begin ##########
def Output(x) :
    y = int((19 - x) / 2)
    print(' ' * y, '*' * x, ' ' * y, sep = '')
l = [5, 7, 10]
for i in l :
    for j in range(i) :
        Output(j * 2 + 1)
for i in range(6) :
    Output(3)
########## End ##########

T3 矩阵乘法

关于矩阵乘法,我们的想法是先建立一个答案矩阵大小的零矩阵,之后我们就计算每个位置的值即可。具体实现,我们对于答案矩阵的每个位置,把可以贡献这个位置的乘法对都加到一起即可。

########## Begin ##########
def multiply(A, B) :
    n, m, p = len(A), len(A[0]), len(B[0])
    C = []
    for i in range(n) :
        mdl = [0] * p
        C.append(mdl)
    for i in range(n) :
        for j in range(p) :
            for k in range(m) :
                C[i][j] += A[i][k] * B[k][j]
    return C
########## End ##########
import myMatrix 
num1 = int(input())
num2 = int(input())

A = myMatrix.getMatrix(num1)
print('A=')
myMatrix.printMatrix(A)

B = myMatrix.getMatrix(num2)
print('\nB=')
myMatrix.printMatrix(B)

C=multiply(A, B)
print('\nC=AxB=')
myMatrix.printMatrix(C)

T4 验证哥德巴赫猜想

关键在于那个 i s _ p r i m e is\_prime is_prime函数,只要有约数就是 F a l s e False False
那么 G o l d b a c h Goldbach Goldbach最后的 r e t u r n return return不会被执行到因为我们知道他一定会在循环里就 r e t u r n return return掉,但是不写的话 P y t h o n Python Python会报错。

########## Begin ##########
def is_prime(x) :
    if x == 2 :
        return True
    for i in range(2, x) :
        if x % i == 0 :
            return False
    return True
def Goldbach(x) :
    for i in range(2, x) :
        if is_prime(i) and is_prime(x - i) :
            return i, x - i
    return 0, 0
########## End ##########
N=int(input(''))
N1,N2 = Goldbach(N)
print('%d = %d + %d' % (N, N1, N2))

T5 实现欧拉函数

两个数互质的条件就是最大公约数是 1 1 1,这里我们递归实现 G c d Gcd Gcd函数。
Φ \Phi Φ的实现当然是容易的,循环一下就行。

########## Begin ##########
def Gcd(x, y) :
    if x % y == 0 :
        return y
    return Gcd(y, x % y)
def Phi(x) :
    mdl = 0
    for i in range(1, x) :
        if Gcd(i, x) == 1 :
            mdl += 1
    return mdl
########## End ##########
n=int(input(''))
print('Phi(%d)=%d' % (n, Phi(n)))

T6 推翻欧拉的猜想

用函数封装的话确实很好写,首先用 f ( x ) f(x) f(x)来计算欧拉素数;用 i s _ p r i m e ( x ) is\_prime(x) is_prime(x)函数来实现素数判断, T 4 T4 T4用过了不赘述;
m i n d i v mindiv mindiv来返回最小约数。
这个题的精髓在于,用 w h i l e while while来实现不断地输出 f f f的同时中间变量的递增。最后跳出循环的话,就意味着当前的中间变量是我们要的合数。

########## Begin ##########
def f(x) :
    return x * x + x + 41
def is_prime(x) :
    if x == 2 :
        return True
    for i in range(2, x) :
        if x % i == 0 :
            return False
    return True
def mindiv(x) :
    for i in range(2, x) :
        if x % i == 0 :
            return i, x / i
    return 1, x
i = 1
while is_prime(f(i)) :
    print('f(%d)=%d是素数' % (i, f(i)))
    i = i + 1
x, y = mindiv(f(i))
print('f(%d)=%d=%d*%d不是素数' %(i, f(i), x, y))
########## End ##########

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值