蓝桥杯官网题1(含VIP试题且带详细解析!小白看过来!!

基础练习

非VIP试题

  1. A+B问题


a,b=map(int,input().split())#map函数,空格分隔
print(a+b)

知识点1map函数:map(function, iterable, ...) 是python的内置函数,不了解的可以去菜鸟教程看看

题目中int是函数,且int在function的位置意思是把后面输入的字符转换为整数形式


def square(x):   #计算平方数
    return x**2
map(square,[1,2,3])
  1. 数列排序


n=int(input())
s=list(map(int,input().split()))
s.sort()
for i in range(n):
    print(s[i],end='')

其实这道题没什么好说的,看到这的友友们去复习一下python的range函数!

注意range里要是数字的话,取不到最后一个数!

range也可以以列表为范围

还有就是列表排序用list.sort()

  1. 十六进制转八进制


n=int(input())
s=[]
for i in range(n):
    s.append(int(input(),base=16))
for j in s:
    print(oct(j)[2:])

知识点1:n是用来做行数去循环的

知识点2:十六进制转十进制是用int函数后加base(后加进制数) 任何进制转十进制都是如此

知识点3:需要去掉转制后的前缀,用到列表切片

hex是十进制转十六进制

oct是十进制转八进制

bin是十进制转二进制

  1. 十六进制转十进制


print(int(input(),base=16))
  1. 十进制转十六进制


n=int(input())
print(hex(n)[2:].upper())

知识点 :十进制转十六进制,十六进制中的字母须大写

  1. 特殊回文数(题目没截全,要求是回文数且是五位和六位,回文数不懂的可以去搜搜 这里就不加赘述了)


n=int(input())
s=[]
for i in range(1,10):
    for j in range(10):
        for k in range(10):
            if(2*i+2*j+2*k==n):
                s.append(10**5*i+10**4*j+10**3*k+10**2*k+10*j+i)
                if k==0:
                    s.append(10**4*i+10**3*j+10**2*k+10*j+i)
            elif(2*i+2*j+k==n):
                s.append(10**4*i+10**3*j+10**2*k+10*j+i)
for m in sorted(s):
    print(m)
   

知识点1:基本思路是五位的情况:条件2*i+2*j+k==n,输出的回文数是10**4*i+10**3*j+10**2*k+10*j+i,六位的同理,最好自己思考一下,再去看代码

需要注意的是当k=0,n为36时(为什么会考虑到36,因为i,j=9,k=0是特殊情况),会出现五位时,2*9+2*9+0=36,但六位时2*9+2*9+2*0=36,如果不单独考虑这种情况,在代码第十行的if条件中,99099就会被忽略掉,所以要在六位数的if语句下,加考虑k=0的if条件语句,且结果是k=0为五位数的情况(99099)加在里面,99099就不会被忽略掉

注意:还要注意是从小到大的顺序

错误点
  1. 用的是elif

  1. a+b==n要用比较运算符==

  1. 回文数(很经典的问题,是俺在学校学python遇到第一个有难度的)


s=[]
for i in range(1,10):
    for j in range (10):
        s.append(10**3*i+10**2*j+10*j+i)
for m in sorted(s):
    print(m)    

仍需注意从小到大的顺序问题

  1. 特殊的数字


s=[]
for i in range (1,10):
    for j in range(10):
        for k in range(10):
            if (i**3+j**3+k**3==10**2*i+10*j+k):
                s.append(i**3+j**3+k**3)   
for m in sorted(s):
    print(m)     

(不搞花里胡哨的了hhhh,直接在题下写解析)

此题最重要的地方就是这个特殊的数字,它是由它的立方和组成的,如题中给的例子153=1*1*1+5*5*5+3*3*3,在代码中体现为i**3+j**3+k**3==10**2*i+10*j+k

仍需注意从小到大排序

气死了!!!!!笨人忘记缩进了,顺便提醒大家,比赛时一定要检查好缩进和:

  1. 杨辉三角(笨人我研究了两天!终于搞明白了,接下来看俺讲给大家听

这道题我了解到有三种解法,先copy一下我觉得最容易理解的一种(此代码的出处


i = [[0,1,0],[0,1,1,0]] # 建立前两行
n = int(input())# 输入行数
for p in range(2,n):#控制行数,从第三行开始算
    o = i[-1] #获得上一行的数据
    u = [] #储存下一行数据
    for v in range(len(o)-1):#进行计算
        u.append(o[v]+o[v+1])#根据性质:三角形中的每个数字等于它两肩上的数字相加
    u.insert(0,0)#在最前面插入0 方便计算下一行的第一项的1
    u.append(0)#在尾部加入0 方便计算下一行的最后一项的1
    i.append(u)#将新的行的数据储存进i内
for list_ in i:#抽出每一行进行打印
    for q in list_[1:-1]:#抽出每个数据 用切片把第一个零和最后一个0隔开
        print(q,end = ' ')#打印每一个数据 末尾用空格
    print()#换行

思路很容易理解,而且注释也很详细了

还有一种我没太想到的思路(代码出处是上面的链接


n=int(input())
nums=[[0]*n for i in range(n)]#初始化一个n*n的零阵
for i in range(n):
    for j in range(n):
        if j==0:
            nums[i][j]=1
        else:
            nums[i][j]=nums[i-1][j-1]+nums[i-1][j]
        if nums[i][j]!=0:
            print(nums[i][j],end=' ')
    print()     

这里nums[0][0]是指在初始化的零阵中,某数字的位置,第一行的第一个数,那么在杨辉三角中,nums[0][0]=1,然后开始双循环,第一个for是控制行数,第二个是控制一行中的数字,因为杨辉三角第一行(i=0)第一个数(j=0)是1,所以有了if语句

杨辉三角的本质是每一个数等于他肩上的两个数之和( nums[i][j]=nums[i-1][j-1]+nums[i-1][j]),基本到这就结束了,然后就是输出,最后一行的print()是换行(该print的位置是第一个换行for循环下的,注意好缩进)

刚开始的初始化一个n*n的零阵也值得记一下(他是如何定义零阵的)反正笨人我是没想到,这道题也是关于二维数组这个知识点的应用,带大家学习一下

错误点
  1. 初始化一个零阵(二维数组)

  1. 阵的使用方法s[1][2],中括号里表示的是对应的位置,如s[1][2]是表示在阵中第一行第二列的数是多少

二维数组

知识点的出处

二维数组

我就简单概括一下s(某列表)[行号][列号]=(数字)

  1. 查找整数


n=int(input())
nums=list(map(int,input().split()))
a=int(input())
count=0#引入计数器
for i in range(len(nums)):
    if a==nums[i]:
        print(i+1)#位置从1开始编号
        count+=1
        break
if count==0:
    print(-1)
  
    

此代码出处为

查找整数

1:计数器的引入,如果不加计数器的话,是if i==len(nums)-1: 然后print(-1)没有考虑到列表长度为1的情况,

2:break语句大家复习一下

break

笨人我此题的错误点nums=list(map(int,input().split())),split用法错误,我放在map的外面了!大家也注意一下

  1. 数列特征


n=int(input())
s=list(map(int,input().split()))
print(max(s))
print(min(s)) 
sum=0
for i in s:
    sum+=i
print(sum)  

这道题还是比较简单的 总结:找最大数用max()函数,最小用min()函数

求列表里数字的和就用sum搭配for循环

然后让输出一串数字,并且题目是围绕这一串数字展开的就用s=list(map(int,input().split()))

  1. 字母图形


n,m=map(int,input().split())
for i in range(n):
    for j in range(m):
        print(chr(65+abs(i-j)),end='')
    print()

这个解法是我找到的最简单的一种方法,涉及到chr()函数是输入一个整数[0,255]返回其对应的ascii符号,那与之作用相反的函数是ord(),返回的是单个字符的ASCII值

abs()是python的内置函数,作用是返回为绝对值

仍需注意换行print()是在第一个循环下的

解法和知识点讲解来自

代码来源

  1. 01字串


for i in range(32):
    print('%05d'%int(str(bin(i))[2:]))

这道题就是python的细知识点了

%d是指格式化整数,%nd是输出整数的宽度至少是n位且右对齐,%05d是指表示输出的整数宽度为5且用0补足

  1. 闰年判断


n=int(input())
if (n%4==0 and n!=100) or n%400==0:
    print('yes')
else:
    print('no')

这道题就是一个简单if语句,但是闰年的特征最好记住,可能竞赛或考试不会给你这个特征!

  1. Fibonacci数列

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

找到个详细无比的解析,真的很详细了,笨人我都能看懂


n=int(input())
F=[1,1]
if n<=2:#减小运行内存
    for i in range(n):
        F.append(F[i]+F[i+1])
    print(F[n-1]%10007)
else:
    for i in range(n-2):
        result=(F[1]+F[0])%10007 #加快运行时间
        F[0],F[1]=F[1],result    #运算往下迭代运行
    print(result)
       
  1. 圆的面积


import math
n=int(input())
s=math.pi*n**2
print('%.7f'%s)

这道题需要注意的是 import

且使用pi时,要在其前面加上math.

  1. 序列求和


n=int(input())
sum=0.5*n**2+0.5*n
print(int(sum))

这道题没有用for循环是因为,运行时间超时了,用数学思维去考虑这道题的话,就用等差求和

注意sum输出时要加上int

VIP试题

  1. 阶乘计算


n=int(input())
a=1
for i in range(1,n+1):
    a*=i
print(a)

当我看到它的算法要求我就懵了,但是我自己做的时候忽略了这条,正常拿for循环,但是是满分

但是考虑到这道题考察到数组,还是去找找数组做的方法

求一个看懂这个的大佬555

  1. 高精度加法

因为python支持高精度


a=int(input())
b=int(input())
print(a+b)

用算法描述中的思路找到了这种方法


a=list(input())
b=list(input())
l=abs(len(a)-len(b))
for i in range(l):
    if len(a)>len(b):
        b.insert(0,0)
    else:
        a.insert(0,0)
c=[]
r=0
for x,y in zip(a[::-1],b[::-1]):
    s=int(x)+int(y)+r
    if s>=10:
        r=s//10#//是去商
    else:
        r=0
    c.insert(0,str(s%10))#%是取余数
c.insert(0,str(r))
print(int(''.join(c)))

整体思路:

把两位数相加 用手写的方式表达

1.补零 有时两个数的位数不一定相等,但是算数的话都是从个位数(也就是列表的最后一位数开始算),所有需要用0把位数补齐,例如a列表的长度(a数字的位数)大于b列表,就在b列表的0的位置加0(insert函数),直到len(a)=len(b),也就是两个数位数相等,那么就可以开始进行运算了

2.开始算数:两个数一个数一个循环(本题中用了zip函数,可两个数同时循环),从最后一位开始(列表中的-1位置)

第一次循环:两个列表的最后一位相加,会出现两种情况

一种是图中的9+0,没满十的情况(就例子来讲,另一种情况下面会解释的

s=9+0=9,r=0,c.insert(0,9)

18行的代码是在for循环外的,也就是说for循环结束,才会用到这行代码

第二次循环:跟第一次循环一样,最后是c.insert(0,8)

第三次循环:是上面提到的第二种情况,s=9+1=10(满十了,需要进位),r=10//10=1,c.insert(0,0)

剩余循环就和上面的循环相似了

到了18行代码,其实是用来在最前面的一位,加1的,看最后一次循环,也就是4+9那次,这次循环的结果仅是得出c.insert(0,3)的,等到18行代码时,会加上r(此时r=1),到此算数完成,下面就可以输出喽

3.输出:因为输入的时候把数字转成了列表,那么输出的时候需要把得到的列表转回数字(用int函数的原因)int()参数必须是字符串、对象或数字之类的字节,而不是“list”.

join函数 三个小时才彻底弄懂一道题,想紫砂

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值