【思特奇杯·云上蓝桥-算法集训营】第一周

第一题:跑步训练

答案: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

上一篇:python小题入门练习(不断更新...)


下一篇:微信小程序组件篇实战