第一题:跑步训练
答案:3880
代码如下
第二题:阶乘约数
答案:39001250856960000
代码如下
#阶乘约数
n = 100
# 因为数不大,就用最普通的方法统计质数了。
p = [2]
for i in range(3, n + 1):
j = 2
while j < i:
if i % j == 0: break
j += 1
else: p.append(i)
#print(p) # 2 3 5 7 ... 97(求出所有的质数。)
m = {}
for i in p: m[i] = 1 # 每个质数初始为 1,代表不选这个质数的可能。
for i in range(2, n + 1): # 遍历 [2, 100]
x = i
for j in p: # 遍历质数,将每个被乘数都质因数分解一下。
# (比如 6 分解成 2*3 ,12 分解成 2*2*3)
if j > x: break
while x % j == 0:
x //= j
# 让对应的质数个数 + 1
m[j] += 1
s = 1
# 所有质因子的个数相乘,就是约数个数了。
for i in m.values():
s *= i
print(s)
第三题:出栈次序
答案:35357670
代码如下
第四题:哥德巴赫分解
答案:173
代码如下
def find(n):
def IsPrime(num):
if num < 2:
return False
if num == 2:
return True
for w in range(2,num):
if num % w == 0:
return False
return True
for i in range(2, n // 2 + 1):
if IsPrime(i) and IsPrime(n - i):
return [i,n-i]
ls = []
for i in range(4,10001,2):
ls.append(min(find(i)))
print(max(ls))
运行结果如下:
第五题:图书排列
答案:479306
代码及运行结果如下:
第六题:猴子分香蕉
答案:3141
代码及运行结果如下
第七题: 代码如下
from fractions import Fraction
def check(x):
if x == 2:
return True
for i in range(2, x):
if x%i==0:
return False
return True
if __name__ == '__main__':
m = []
All = []
for i in range(2, 100):
if check(i):
m.append(i)
print(m)
for i, j in enumerate(m):
for k in m[:i]:
a = Fraction(k, j)
if a not in All:
All.append(a)
All = sorted(All)
print(All)
a = int(input('输入分子:'))
b = int(input("输入分母:"))
num = Fraction(a, b)
out = False
for i in range(len(All)):
if All[i] >= num:
print(All[i-1])
out = True
break
if not out:
print(All[-1])
第八题:excel地址
代码如下
x = [chr(i) for i in range(65,91)]
n = int(input())
res = []
while n != 0:
if n % 26 == 0:
res.append(26)
n = n // 26 - 1
else:
res.append(n % 26)
n = n//26
for i in range(len(res)):
res[i] = x[res[i]-1]
res.reverse()
print(''.join(res))
第九题:日期问题
代码如下
def solution(all_date):
for date in all_date:
flag = 1
s = ''
#年份
if date[0] >= '60' and date[0] <= '99':
s = s + '19' + date[0] + '-'
elif date[0] < '60' and date[0] > '00':
s = s + '20' + date[0] + '-'
else:
flag = 0
#月份
if date[1] > '00' and date[1] <= '12':
s = s + date[1] + '-'
else:
flag = 0
#日
if date[2] > '00' and date[2] <= '31':
s = s + date[2]
else:
flag = 0
if flag == 1:
print(s)
return
if __name__ == '__main__':
s = '02/03/04'
date = [s[:2],s[3:5],s[6:]]
all_date = [#日期的三种可能情况
[date[0],date[1],date[2]],
[date[2],date[0],date[1]],
[date[2],date[1],date[0]]]
all_date.sort()
solution(all_date)
第十题:整数划分
代码如下
#整数划分
def solution(n):
ans = [[n]]
for i in range(1,n):
a = [[n]]
while a[-1][-1] - i> 0:
tmp = a[-1][:-1] + [i,a[-1][-1] - i]
tmp.sort()
if tmp not in a:
a.append(tmp)
for j in a:
if j not in ans:
ans.append(j)
#for j in ans:
# print(j)
return len(ans)
if __name__ == '__main__':
n = 5
ans = solution(n)
print(ans)
第十一题:一步之遥
答案:97
代码及运行结果如下
第十二题:机器人塔
代码如下
import math
def check():# 判断是否可以向上拓展
a = 0
b = 0
tmp = row
while tmp >0:
for i in range(1, tmp+1):
if cnt[i] == 1:
a +=1
else:
b += 1
for i in range(2, tmp+1):
if cnt[i-1]==cnt[i]:
cnt[i-1] = 1
else:
cnt[i-1] = 2
tmp -=1
if a == m and b == n:
return True
else:
return False
def dfs(k):# 遍历所有第一排
global res
if k > row:
if check():
res +=1
return
cnt[k] = 1
dfs(k+1)
cnt[k] = 2
dfs(k+1)
if __name__ == "__main__":
m = int(input())
n = int(input())
res = 0
cnt = [0 for _ in range(100010)]
row = int(math.sqrt(2*(m+n)))
dfs(1)
print(res)
第十三题:七星填空
代码如下:
import itertools
x = [i for i in range(1, 15)]
x.remove(6)
x.remove(11)
x.remove(14)
def check(a):# 这道题对数字的排序完全是自定义,每次比较是为了减少所需要的时间
num1 = a[0] + a[1] + a[2] + a[3]
num2 = 6 + a[1] + a[4] + 14
if num1 != num2:
return False
num3 = 6 + a[2] + a[5] + 11
if num2 != num3:
return False
num4 = a[3] + a[5] + a[7] + a[10]
if (num3 != num4):
return False
num5 = a[8] + a[9] + a[7] + 11
if (num4 != num5):
return True
num6 = a[6] + a[10] + a[8] + 14
if (num5 != num6):
return False
num7 = a[0] + a[4] + a[6] + a[9]
if (num6 != num7):
return False
return True
for i in itertools.permutations(x):
if check(i):
print(i)
for j in range(4):
print(i[j])
break