Python算法学习: 竞码编程-蓝桥杯模拟赛题解

昨天闲来无事在一个oj网站上做了几道模拟赛的题,写此博客记录一下

A:战疫情 5’

【问题描述】

为抗击新型冠状病毒感染的肺炎疫情,爱心人士小李花费50000元人民币购买x只口罩,y套防护服。已知x+y的和在区间[20000,21000].

请问有多少种购买方案,是刚好花费50000元人民币的!

已知口罩价格2元/只,防护服价格100元/套。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。

sum = 0
for x in range(21001):
    for y in range(21001):
        if 20000 <= x+y <= 21000 and ((2*x) + (100*y)) == 50000:
            sum += 1
            print(x, y, sum)
        else:
            continue

B:行动 5’

在这里插入图片描述

【问题描述】

小明站在坐标(0, 0)处,面朝 x轴正方向。第一轮,他向前走 1单位距离,然后右转;第二轮,他向前走 2单位距离,然后右转;第三轮,他向前走 3单位距离,然后右转……他一直这么走下去。请问第 2020轮后,他的坐标是:(_________,_________)。

题解:

这个题目手算很简单!总共2020步,每44步一圈,每一圈横坐标-2,纵坐标+2。刚好505圈.

当然这个题目也可以用循环,循环2020次。

在第ii次循环,

如果i%4=1,则x+i

如果i%4=2,则y-i

如果i%4=3,则x-i

如果i%4=4,则y+i

答案:-1010 1010

C:莱布尼茨公式 10’

在这里插入图片描述

numerate : float = 4.0
denominator : float = 1.0
operation : float = 1.0
PI = 0
for i in range(1, 2021):
    PI += operation * (numerate / denominator)
    denominator += 2
    operation *= -1
print('%.6f' % PI)

D:价值之和 10’

【问题描述】

定义数字x的价值为其不同质因子的个数。

例如:数字2020可以写成2020=225*101其价值为3

JM boy请你帮忙计算整数1到2020中,所有都不包含数字5的正整数的价值之和。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数(提示:答案最后一位数是奇数)

def get_num_factors(num):
    list = []
    tmp = 2
    if num == tmp:
        list.append(tmp)
    else:
        while num >= tmp:
            k = num % tmp
            if k == 0:
                if tmp not in list: # 去重
                    list.append(tmp)
                    num = num / tmp
                else:
                    num = num / tmp
            else:
                tmp += 1
    len_list = int(len(list))
    return len_list

if __name__ == '__main__':
    sum = 0
    for i in range(1, 2021):
        if '5' not in str(i):
            sum += get_num_factors(i)
            # print(i)
        else:
            continue
    print(sum)


E:数方 15’

在这里插入图片描述

def is_pingfang(n):
    for i in range(2, 32):
        if pow(i, 2) == n:
            return True
        else:
            continue
def is_lifang(n):
    for i in range(2, 10):
        if pow(i, 3) == n:
            return True
        else:
            continue

def is_sifang(n):
    for i in range(2, 6):
        if pow(i, 4) == n:
            return True
        else:
            continue

def is_huiwen(n):
    if str(n) == str(n)[::-1]:
        return True
    else:
        return False
def is_sanjiao(n):
    for i in range(1, 46):
        n -= i
        if n == 0:
            return True
        else:
            continue
def is_zhishu(n):
    flag = True
    for i in range(2, n):
        if n % i != 0:
            continue
        else:
            flag = False
            break
    return flag



if __name__ == '__main__':
    for a in range(1, 10):
        for b in range(1, 10):
            for c in range(1, 10):
                for d in range(1, 10):
                    for e in range(1, 10):
                        for f in range(1, 10):
                            for g in range(1, 10):
                                for h in range(1, 10):
                                    for i in range(1, 10):
                                        if is_lifang(int(str(a)+str(b)+str(c))) and is_zhishu(int(str(d) + str(e) + str(f))) and is_pingfang(int(str(g) + str(h) + str(i))) and is_sanjiao(int(str(a) + str(d) + str(g))) and is_sifang(int(str(b) + str(e) + str(h))) and is_huiwen(int(str(c) + str(f) + str(i))):
                                            print("正确答案:")
                                            print(a, b, c, d, e, f, g, h, i)
                                            break
                                        else:
                                            continue

F:你好,2020

'''
2020年,这个年份很特别,2020从中间分成两个整数,大小形状完全一样。

小明对形如2020的数字很感兴趣(不包括前导零),在1到1200中这样的数字包括11、22、33、44、55、66、77、88、99、1010、1111共11个,他们的和是2616

请问,在1到n中,所有这样的数的和是多少?
'''
n = int(input())
sum = 0
for i in range(1, n+1):
    if int(len(str(i))) % 2 == 0:
        if i <= 99:
            left = str(i)[0]
            right = str(i)[1]
            if left == right:
                sum += i
            else:
                continue
        else:
            half_len = len(str(i)) // 2
            left = str(i)[0:half_len]
            right = str(i)[half_len:]
            if left == right:
                sum += i
            else:
                continue
print(sum)

G:最优值 18’

在这里插入图片描述

def main():
    n = int(input())
    ans = 0
    anslist = []
    for i in range(n):
        word = input()
        len_word = len(word)
        anslist.append(((ord(word[0])-96))*len_word)
    anslist = sorted(anslist)
    for i in range(n):
        ans += anslist[i]*(i+1)
    print(ans)
if __name__ == '__main__':
    main()

H:计算器 22’

s=input()
x = ''
for i in s:
    if 97<=ord(i)<122:#取出未知数字母
        x=i
s=s.replace(x,'x')#把未知数字母替换成x
#表达式变形 如-5+2x=-10 -> -5+2*x-(-10)
s=s.replace('=','-(')+')'
s=s.replace('x','*x')
s=s.replace('+*x','+x')
s=s.replace('-*x','+x')
s=s.replace('(*x','(x')
#合并表达式,要用到复数,-5+2*x-(-10) -> (5+2j)
value=eval(s,{'x':1j})
# print(value)
# print(value.real) # 取实数部分
# print(value.imag) # 取复数部分
print('%s=%.3f'%(x,-value.real/value.imag))#5+2j=0,j就是未知数

J:因数个数

'''
描述
求所有 2 到 n 的整数中,因数个数第k少的数因数个数是多少。

输入
第一行两个正整数 n,k即题目描述中的 n,k

输出
输出仅一行,即因数个数第 k少的数因数个数。
'''

def get_num_factors(num):
    tmp = 1
    ll = 0
    if num == tmp:
        return num
    else:
        while num >= tmp:
            k = num % tmp
            if k == 0:
                ll += 1
                tmp += 1
            else:
                tmp += 1
    return ll

if __name__ == '__main__':
    n,k = map(int, input().split())
    list = []
    for i in range(2, n+1):
        list.append(get_num_factors(i))
    list = sorted(list)
    print(list[k-1])

上述为最简单的思路也是非常慢的思路
改进:

'''
我们利用素数筛选的原理,两重循环,第一重 i : 2 到 n,第二重,j = 2 * i,到 n(间隔 i ),也就是,当我们找到 i,那么 i 的倍数的因子个数 + 1,因为 i 是所有 i 的倍数的因子。
'''

if __name__ == '__main__':
    n, k = map(int, input().split())
    qList = [2 for i in range(n + 1)]  # 初始因数都为2 (1和本身)

    for i in range(2, n + 1):
        for j in range(2 * i, n + 1, i):
            qList[j] += 1  # 所有i倍数的因数加一

    ansList = sorted(qList)[2:]  # 从2-n开始, 所以取出0,1
    print(ansList[k - 1])  # 因为列表从0开始计数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值