【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 ##########