蓝桥杯部分题目 python实现

1.隔行变色

'''
思路:由题意每行的颜色为 蓝 白 交替
    第21行到50行之间共有50-21+1=30行

'''
result=(50-21+1)/2
print(int(result))#15

2.立方尾不变

'''
思路:将符合立方尾不变的数字存入列表,最后统计列表中数字的个数
    通过对数字立方后的运算结果 转化为字符串 再进行分段切片处理
    因为是10000以内的数字,我们可以把它分为10、100、1000、10000
'''
data=[]
for i in range(1,10001):
    if i<10:
        if i==int(str(pow(i,3))[-1]):
            data.append(i)
    elif i<100:
        if i==int(str(pow(i,3))[-2:]):
            data.append(i)
    elif i<1000:
        if i==int(str(pow(i,3))[-3:]):
            data.append(i)
    elif i<10000:
        if i==int(str(pow(i,3))[-4:]):
            data.append(i)

print(len(data))    #36

3.煤球数量

'''
思路:
    由题目可知道前4层数量分别为1 3 6 10
    思路1:可以发现规律 本层数量=上一层数量+本层层数
    思路2:每一层数量之间差值构成等差数列


'''
s,n=0,0   #s表示数量之和,n每层数量数
for i in range(1,101):
    n+=i
    s+=n
print(s)        #171700

4.有奖竞猜

'''
思路:
    猜谜结果已经知道
    开始777个币,猜错扣555个币
    根据结果不存在扣光情况

'''
result='vxvxvxvxvxvxvvx'
count=777 #初始币量
wrong=555#猜错扣除币量
for i in result:
    if i=='v':#如果猜对
        count*=2
    else:#如果猜错
        count-=wrong
print(count)    #58497

5.平方怪圈

'''
思路:
    正整数的每一位平方后再求和,得到的新整数继续这样操作。
    直接进行暴力求解,当出现重复的数字的时候我们停止循环,我们将计算的数纳入列表并且将最后的数输出,我们就会看出那些在循环中,然后就可以直接看出最大
    将每次计算的结果存入列表
    再找出列表中最大值
'''

x = int(input())
result = []#将每次计算的结果存入列表
s = 0
while s not in result:
    result.append(s)
    s = 0
    a = list(str(x))#将输入转化为字符串,便于每一位都平方后再求和
    for i in range(len(a)):
        s += int(a[i])**2
    x = s

print(max(result))  #145

6.奇妙的数字

'''
思路:将平方和立方后的数字拼接成为字符串,再将字符串转化为列表,再将列表中数字转化为整型,对列表中数字排序后再将其转化为字符串列表
    最后将处理好的字符串拼接好,如果结果和目标字符串一样就输出该数字


'''
for i in range(1,10000):
    c=str(pow(i,2))+str(pow(i,3))   #将平方和立方后的数字拼接成为字符串
    d=[int(i) for i in c]#将列表中数字转化为整型
    l=[str(i) for i in sorted(d)]#列表中数字排序
    if ''.join(l)=='0123456789':
        print(i)#69

7.四平方和

'''
思路:
先找到单个数字平方后的边界(平方后小于n)
通过逐个循环,并且在第二次以后的每一层循环加入判断
'''
import math
n = int(input())
x = int((math.sqrt(n)))+1 #找到单个数字平方后的边界(平方后小于n)
ls = [pow(i,2) for i in range(0,x)]#用于确定d的存在

for a in range(x):
    for b in range(a,x):
        if a*a+b*b>n:#排除前2个元素平方和大于n情况
            break
        for c in range(b,x):
            d=n-a*a-b*b-c*c
            if d<0:#排除前3个元素平方和大于n情况
                break
            elif d in ls:
                t=sorted([a,b,c,int(math.sqrt(d))])#对4个元素排序
                print(' '.join([str(i) for i in t]))
                exit()

8.移动距离

'''
思路:
    将小区看作一个矩阵,小区序号按照S形状分布
    通过分析,若将m坐标看作(x1,y1) n坐标看作(x2,y2),则m和n之间最短距离为|x1-x2|-|y1-y2|

'''

w, m, n = map(int,input().split(' '))#6 8 2
y = max(m,n)//w + 1 #找到矩阵中最大的行数
jz = []
res = []
for i in range(y):
    temp = [j for j in range(w*i+1, w*(i+1)+1)]#按规则生成每行序列
    if i%2 == 0:
        jz.append(temp)
    else:
        temp = temp[::-1]
        jz.append(temp)
    if m in temp:#记录坐标
        res.append([temp.index(m)+1,i+1])
    if n in temp:#记录坐标
        res.append([temp.index(n)+1,i+1])
# print(jz)
print(abs(res[0][1]-res[1][1]) + abs(res[0][0]-res[1][0]))

9.冰雹数

'''
思路:
    判断输入数字的奇偶,分别执行不同的运算方法,并且将每次运算的结果写入列表,当运算的数字等于一以后,循环停止
    将每个数字运算结果生成一个列表,再将每个数字生成的列表添加到result=[],通过循环result=[]找出最大的值,再将值存入max_result=[]
    最后print(max(max_result))即可。

'''
nums=int(input())
result=[]
max_result=[]

for num in range(1,nums+1):#遍历不大于N的每个数字
    inner=[]
    inner.append(num)
    while num!=1:
        if num%2==0:
            num/=2
            inner.append(int(num))
        else:
            num=num*3+1
            inner.append(int(num))
    result.append(inner)
for res in result:
    max_result.append(max(res))
print(max(max_result))

10.打印大X

'''
思路:观察发现每行符号个数x=m+n-1,总共行数y=n
    构造出一个输入m n大小的矩阵
    通过循环画出x上半部分(包括中间),再画出x下半部分,最后拼接矩阵

'''

m,n=map(int,input().split())
jz=[['.' for i in range(m+n-1)] for j in range(n)]#构造出一个输入m n大小的矩阵
for x in range(int((n+1)/2)):#画出x上半部分(包括中间)
    for y in range(m):
        jz[x][x+y]='*'
    for y in range(-m-x,-x):
        jz[x][y] = '*'
for x in range(int((n+1)/2),n):#画出x下半部分
    jz[x]=jz[n-x-1]
for i in jz:
    print(''.join(i))

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值