Python蓝桥31天,第九天

1. 最大乘积

题目描述

在这里插入图片描述

思路

方法超时,但是好像有个什么唯一结果的什么算法,不是很清楚,但是暴力也能做,用permutations将所有的1-9排列组合,然后从中间插*看看一个个看结果

代码

import itertools

Max = 0
lis = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for stnum in itertools.permutations(lis, 9):
    number = "".join(list(map(str, stnum)))
    for i in range(1, 8):
        a = int(number[:i])
        b = int(number[i:])
        c = int(a * b)
        if len(list(set(str(c)))) == 9 and "0" not in set(str(c)):
            # print(f"{a} * {b} = {c}")
            Max = max(Max, c)
print(Max)

2. 阶乘约数

题目描述

在这里插入图片描述

思路

正约数就是因数,100!的正约数就是100,99,98……1的正约数(1没有),所以求100!的正约数其实就是求100以内所有数的正约数,但是人家求的是正约数的个数
一个数的约数,就是他每个质因子的数量+1后相乘的结果,比如35 = {5:1,7:1}=》(1+1)*(1+1) = 4 个约数(1,5,7,35)如此
本人数论并不好。。大佬给的思路
根据题目可以知道,要有两个任务,1. 求某个数的所有质因数 2. 统计这个质因数的出现次数

代码

def Primer(n):
    '''
    得到n的所有质因子的个数,用字典note记录
    note的key表示这个质因子,value表示这个质因子出现的次数
    :param n:
    :return note:
    '''
    note = {}
    for i in [2, 3]:
        z = 0
        while n != i:
            if n % i != 0:
                break
            z += 1
            note[i] = z
            n //= i
    for j in range(1, int(n ** 0.5 // 6 + 2)):
        i1 = j * 6 - 1
        i2 = j * 6 + 1
        if i1 > n:
            break
        for i in [i1, i2]:
            while n != i:
                z = 0
                if n % i != 0:
                    break
                z += 1
                note[i] = z
                n //= i
    if not note.__contains__(n):
        note[n] = 1
    else:
        note[n] += 1
    return note


def sum_dic(a, b):
    """
    合并字典,key取a,b字典key的并集,temp记录合并结果
    比如a = {2:3,3:2} a字典记录了某个合数的质因子中,2有3个,3有2个(2*2*2*3*3 = 72)
    比如b = {3:1,7:2} b字典记录了某个合数的质因子中,3有1个,7有2个,(3*7*7)
    temp = {2:3,3:3,7:2}
    :param a: 字典
    :param b: 字典
    :return temp:
    """
    temp = {}
    for key in a.keys() | b.keys():
        temp[key] = sum(d.get(key, 0) for d in (a, b))
    return temp


dic = {2: 1}  # 100的阶乘由1~100相乘,1没有质数,2自己有一个,所以把2~100每个数的质因数的数量(字典)做和就是100!的所有质数和
for i in range(3, 101):
    dic = sum_dic(dic, Primer(i))
ans = 1
for i in dic.items():
    ans *= i[1] + 1  # 一个数的约数,就是他每个质因子的数量+1后相乘的结果,比如35 = {5:1,7:1}=》(1+1)*(1+1) = 4 个约数(1,5,7,35)如此
print(ans)

3. 含 2 天数

题目描述

在这里插入图片描述

思路

这已经是今天我觉得最简单的题了,哎
直着去思考就行,含有当year含有2时把这一年的天数统计出来,当month含有2的时候,分2月和12月,2月有28和29,12月就31,其他月含有2的只能在day里含有,是固定的,【2,12,20-19】 12个
如此一般代码直接统计

代码

import datetime


days = 0
for i in range(1900, 10000):
    start = datetime.date(i, 1, 1)
    y = start.year
    m = start.month
    if "2" in str(y):
        days = days + int(str(datetime.date(i + 1, 1, 1) - datetime.date(i, 1, 1))[:3])
        continue
    for m in range(1, 13):
        start = datetime.date(i, m, 1)
        if m == 2:
            days = days + int(str(datetime.date(i, m + 1, 1) - datetime.date(i, m, 1))[:2])
            continue
        if m == 12:
            days = days + 31
        else:
            days = days + 12
print(days)

4. k倍区间

题目描述

思路

我能受这委屈?我昨天刚学的前缀和
好吧确实不会
借鉴了一下大佬的思路
附注大佬思路,请看请看这个讲的更清楚
个人感觉这个代码更好copy(不是)

代码

import math

n, k = map(int, input().split())
sum = 0
arr = [0 for i in range(k)]
for i in range(n):
    sum += int(input())
    arr[sum % k] += 1
ans = 0
for i in range(k):
    ans += math.comb(arr[i],2)
ans += arr[0]
print(ans)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值