蓝桥杯python试题集VIP版

在这里插入图片描述

定义二维列表:

方法一

a = [[i for i in range(10)] for j in range(10)]  # 10行10列,每一行内容为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a)
print('=' * 80)
b = [[0 for i in range(10)] for j in range(10)]  # 10行10列,每一行内容为[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
print(b)

运行结果

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
====================================================================================================
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

方法二

c = []
for i in range(10):
    c.append([j for j in range(10)])

print(c)

运行结果

[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

字符串转换为变量

SNR50 = list()
SNR40 = list()
SNR30 = list()
SNR20 = list()
SNR10 = list()
SNR0 = list()
nmse = 2
for k in range(6):
    # ('SNR'+ str(k * 10)).append(k)  # 报错:AttributeError: 'str' object has no attribute 'append'
    locals()[('SNR'+ str(k * 10))].append(nmse)

python 中元组和列表a[::-1]和a[:-1]的区别

# 例子:
a=(7,9,10,11)
b=[3,4,5,6]
a(::-1)=(11,10,9,7)
b[::-1]=[6,5,4,3]
# 从中可以看出(::-1)或[::-1]表示的是将元组或列表逆序
# 但是,
a(:-1)=(7,9,10)
b[:-1]=[3,4,5]
# (:-1)或[:-1]则表示的是将元组或列表进行切片,切片的规则是取元组或是列表除最后一位元素的切片

十进制转换其他进制

########### 方法一
# 转十六进制
n = int(input())
a= []
while n > 0:
    if n % 16 < 10:
        a.append(n % 16)
    if n % 16 == 10:
        a.append("A")
    if n % 16 == 11:
        a.append("B")
    if n % 16 == 12:
        a.append("C")
    if n % 16 == 13:
        a.append("D")
    if n % 16 == 14:
        a.append("E")
    if n % 16 == 15:
        a.append("F")
    n = int(n / 16)
    
print(a[::-1])
# 转二进制
n = int(input())
a= []
while n > 0:
    a.append(n % 2)
    n = int(n / 2)
    
print(a[::-1])
# 转八进制
n = int(input())
a= []
while n > 0:
    a.append(n % 8)
    n = int(n / 8)
    
print(a[::-1])
########### 方法二
n = int(input())
print("{0:b}".format(n)) # 二进制
print("{0:o}".format(n)) # 八进制
print("{0:x}".format(n)) # 十六进制

入门训练

A+B问题

"""注意一行输入多个数据的写法"""
a, b = map(int, input().split())  # 多行输入
s = a + b
print(s)
a, b, c = map(int, input().split())
print('a = %d, b = %d, c = %d '% (a, b, c))

序列求和

"""用等差数列求和公式去写,用循环递归的方法会超时"""
# 序列求和,求1+2+3+...+n的值。

n = input()
n = int(n)
# 错误结果(0分)
s = n * 1 + n * (n-1)/2
print(int(s))

# 正确结果(100分)
s = int(n * 1 + n * (n-1)/2)
print(s)

圆的面积

"""pi可以通过math包导入,即 math.pi"""
# 给定圆的半径r,求圆的面积。输入包含一个整数r,表示圆的半径。输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积
import math
r = input()
s = int(r) * int(r) * math.pi
print('%.7f'% s)

Fibonacci数列

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

"""把a[i-1],a[i-2]求余以后相加再求余跟直接算出a[n]以后求余效果是一样的,小于10007的时候求余本来也就是他本身。
如果先求出Fibonacci值会运行超时"""
m = input()
f1, f2 = 1, 1
i = 2  # 前两项已经确定
while(i < int(m)):
    i, f2, f1 = i + 1, (f2 + f1) % 10007, f2  # 此种方法不会超时 
    y = f2 - f2 // 10007 * 10007
print(y)

求素数

bound = int(input())
sum = 0
for n in range(2, bound):
    # for i in range(2, n):
    for i in range(2, int((n / 2) + 1)):
        if n % i == 0:
            break
    else:
        sum += n

print(sum)

注:for……else 的用法:见示例

示例1:

for i in range(5):
    print(i) 
else:
    print("Testing")

运行结果

0
1
2
3
4
Testing

示例2:

for i in range(5):
    print(i)
    if i == 2:
        break
else:
    print("Testing")

运行结果

0
1
2

由示例1可知,当for……else 是一个整体,for循环正常结束后,才执行else语句。但(由示例2可知),当遇到break语句时,跳出for……else这个整体,两部分代码都不会执行。

基础练习

数列排序

"""注意:
1. 不确定输入个数的时候的写法,可以把他们放在 list 中。m 编程方法
2. print 默认输出一次换行一次,可以利用 end=' '是换行符变成空格符"""
# 数列排序
# 方法一:(简单方法)
n = int(input())
m = [i for i in map(int, input().split())]  
m.sort()  # 利用python自带函数功能进行排序
# print(m.sort())输出 None,因为此时输出值为 m.sort() 的返回值 None。
# m = m.sort()这样也是返回 None 值
for i in range(n):
   print(m[i], end=' ')  # 默认
  
# 方法二
n = int(input())
m = [i for i in map(int, input().split())]
a = 99999999999999
for i in range(n):
    for j in range(n - 1):
        if m[i] < m[j]:
            t = m[i]
            m[i] = m[j]
            m[j] = t
            
for i in m:
    print(i, end=' ')

十六进制转八进制

"""进制转换问题参考此网页
https://blog.csdn.net/Jerry_1126/article/details/82917014
利用oct()等方法进行输出时,存在数据类型前缀(0o是八进制,0x十六进制),
0b是二进制,不符合题目要求。改用format进行格式输出"""
# 十六进制转八进制
n = int(input())
a = list()
for i in range(n):
    a.append(int(input(), 16))  # int("100", 8)表示 将输入的16进制数 向10进制转换

for j in a:
    # print(oct(j))  # 输出0o71 0o4435274
    print("{0:o}".format(j))  # 0表示第1个位置,:后面跟命令符。o表示八进制

十六进制转十进制

"""n = int(input(), 16)  # 将输入的16进制数,转换成10进制数"""
# 十六进制转十进制
n = int(input(), 16)  # 将输入的16进制数,转换成10进制数
print(n)

十进制转十六进制

"""注意:x为小写,输出的字母为小写,X为大写,输出的字母为大写。按照题目要求更改大小写"""
a = int(input())
s = "{0:X}".format(a)
print(s)

特殊回文数

"""运算中间加一句判断语句,可以节省大量运算时间,程序也不会超时"""
a = int(input())
for i in range(10000, 1000000):
    if i < 100000:

        w_w = int(i/10000)
        w_g = int(i % 10)
        
        if w_w != w_g :  # 节省运行时间,加着一句话就可以使程序不超时
            continue
        
        w_q = int(i/1000) % 10
        w_b = int(i/100) % 10
        w_s = int(i/10) % 10

        if w_w == w_g and w_q == w_s and w_w + w_q + w_b + w_s + w_g == a:
            print(i)
    else:
        y_y = int(i/100000)
        y_g = int(i % 10)
        
        if y_y != y_g :  
            continue

        y_w = int(i/10000)%10
        y_s = int(i/10)% 10
        
        if y_w != y_s:
            continue
         
        y_q = int(i/1000)% 10
        y_b = int(i/100)% 10  
              
        if y_y == y_g and y_w == y_s and y_q == y_b and (y_y + y_w + y_q + y_b + y_s + y_g) == a:
            print(i)

回文数

for i in range(1000,10000):
    q_q = int(i / 1000)
    q_g = int(i % 10)
    if q_q != q_g:
        continue
    
    q_b = int(i / 100 % 10)
    q_s = int(i / 10 % 10)
    if q_q == q_g and q_b == q_s:
        print(i)

特殊的数字

# 153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。
# 编程求所有满足这种条件的三位十进制数。
for i in range(100, 1000):
    b_b = int(i / 100)
    b_s = int(i / 10) % 10
    b_g = int(i % 10)
    if pow(b_b, 3) + pow(b_s, 3) + pow(b_g, 3) == i:
        print(i)

   

杨辉三角形

"""注意题目要求,不能有多余的空格,方法一的分为0,有多于的行于空格"""
#
L = [[0 for i in range(34)] for i in range(34)]
L[0][0] = 1

n = int(input())
for i in range(n):
    for j in range(i+1):
        if i >= 1 and j >= 1:  # >= 之间不能有空格
            L[i][j] = L[i-1][j] + L[i-1][j-1]
        if j == 0:
            L[i][j] = 1
        if i == j:
            L[i][j] = 1
        print(L[i][j], end=' ')
            
    print('\n')
# 此种方法输出为:
>>> 4
1 

1 1 

1 2 1 

1 3 3 1 

# 方法二
L = [[0 for i in range(34)] for i in range(34)]
L[0][0] = 1

n = int(input())
for i in range(n):
    for j in range(i+1):
        if i >= 1 and j >= 1:  # >= 之间不能有空格
            L[i][j] = L[i-1][j] + L[i-1][j-1]
        if j == 0:
            L[i][j] = 1
				# 与上一种方法的区别在每一行最后一个数字的输出
        if j == i:
            print(L[i][j])
        else:
            print(L[i][j], end=' ')
# 此种方法输出为
>>>4
1
1 1
1 2 1
1 3 3 1
# 没有多余的空格与换行符

查找整数

"""查找输入序列中某个数字第一次出现的位置,若果没没有出现,返回 -1 """
n = int(input())
m = [i for i in map(int, input().split())]
f = int(input())
for j in range(n):
    if m[j] == f:
        print(j+1)
        break
    elif j == n - 1:
        print(-1)

数列特征

# 数列特征
n = int(input())
m = [i for i in map(int, input().split())]
print(max(m))
print(min(m))
print(sum(m))

字母图形

"""
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC"""

# 方法一:

""" ord("A")  # 查看ASCII码对应数字
chr(65)  # 字符是 chr 不是char, 将65转换成 A"""
n, m = map(int, input().split())
# #print(ord("A"))  # 查看ASCII码,输出 65
# #print(chr(65))  # 字符是 chr 不是char, 将65转换成 A
a = [chr(i) for i in range(65, 91)]
# #print(a[0])
t = [[0 for j in range(m)] for i in range(n)]
b = [i for i in range(26)]
for i in range(n):
    for j in range(m):
        for k in range(26):
            if abs(i - j) == k:
                t[i][j] = a[k]     
        if j == m - 1:
            print(t[i][j]) 
        else:
            print(t[i][j], end='')

# 方法二

n, m = map(int, input().split())
for i in range(n):
    t = 0
    for j in range(m):
        
        if (65 + i-j) >= 65:
            t += 1
            print(chr(65 + i-j), end='')
            
    for x in range(m-t):
        print(chr(66 + x), end='')
        
    print()

01字串

"""以下两句话输出结果不同,05b表示字宽为5的二进制,不足5位则要高位补0
5b表示字宽为5的二进制,高位不补 0"""
for i in range(32):
    print("{0:05b}".format(i))
    print("{0:5b}".format(i))

闰年判断

"""给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年:
1. 年份是4的倍数而不是100的倍数;
2. 年份是400的倍数。
其他的年份都不是闰年。"""
y = int(input())
if (y % 4 == 0 and y % 100 != 0) or y % 400 ==0:
    print('yes')
else:
    print('no')

阶乘计算

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

高精度加法

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

Huffuman树

"""
1. a.pop(index):删除列表a中index处的值,并且返回这个值.
2. del(a[index]):删除列表a中index处的值,无返回值. del中的index可以是切片,所以可以实现批量删除.
3. a.remove(value):删除列表a中第一个等于value的值,无返回."""
n = int(input())
a = [i for i in map(int, input().split())]
sum = 0

for i in range(len(a)-1):    
    a_min = min(a)
    a.remove(a_min)
    a_min2 = min(a)
    a.remove(a_min2)
    a.append(a_min + a_min2)
    sum += a_min + a_min2
    if len(a) == 1:
        break
        
print(sum)

FJ的字符串

"""FJ在沙盘上写了这样一些字符串:
  A1 = “A”
  A2 = “ABA”
  A3 = “ABACABA”
  A4 = “ABACABADABACABA”
  … …
  你能找出其中的规律并写所有的数列AN吗?"""
# 不要通过定义一个完整的数组,往数组里写字符串,这样占用太大内存。计算也超时。
N = int(input())
A = ""
for i in range(N):
    B = A + chr(65+i) + A
    A = B
print(B)

八皇后问题

cnt = 0


def eight_queen():
    line = [None] * 8  # line存储可行的方案
    f(line, 0)


def f(line, n):
    global cnt
    if n == 8:
        cnt = cnt + 1
        return
    cur = [True] * 8  # 该列表指向一行的八个列。对于当前行,要根据前面的行,看看本行哪个地方可以放,一个一个进行枚举。True / False 表示当前行可不可以放。      
    for i in range(n):   # 看看数据在前 n-1 行的,哪一个列上
        cur[line[i]] = False  # line[i], 表示在第 i 行的第 line[i] 列上有,该列就不能放置。
        k = n - i  # 行差
        # 判断对角是否超出棋盘范围,没有则设为False,即对角不能放置 皇后
        if line[i] + k < 8:
            cur[line[i] + k] = False  # line[i] + k 列
        if line[i] - k >= 0:
            cur[line[i] - k] = False
    # 对可以放的进行枚举
    for i in range(8):
        if cur[i]:
            line[n] = i  # 第 n 行
            f(line, n + 1)


if __name__ == '__main__':
    eight_queen()
    print(cnt)

报时助手

h, m = map(int, input().split())
pron = {0:'zero', 1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine', 10:'ten', 11:'eleven', 12:'twelve', 13:'thirteen', 14:'fourteen', 15:'fifteen', 16:'sixteen', 17:'seventeen', 18:'eighteen', 19:'nineteen', 20:'twenty', 30:'thirty', 40:'forty', 50:'fifty'}


def pro_num1(n):
    if n > 20 and n != 30 and n != 40 and n != 50:
        n_ge = n -int(n / 10) * 10
        print(pron[int(n / 10) * 10],pron[n_ge], end=' ')
    else:
        print(pron[n], end=' ')


def pro_num2(n):
    if n > 20 and n != 30 and n != 40 and n != 50 and n !=0:
        n_ge = n -int(n / 10) * 10
        print(pron[int(n / 10) * 10],pron[n_ge], end=' ')
    elif n == 0:
        print("o'clock")
    else:
        print(pron[n], end=' ')


pro_num1(h)
pro_num2(m)

回形取数

m, n = map(int, input().split())
s = []
for i in range(m):
    s.append([j for j in map(int, input().split())])

if m < n:
    minD = m
else:
    minD = n

lenC = int((minD + 1) / 2)

for t in range(lenC):
    if t == lenC - 1 and (minD + 1) % 2 == 0:  # 最后一个循环,结束后将要跳出
        if m < n:  # 横向输出
            for i in range(t,n - t):  # 此处横向范围不同于下方的横向
                print(s[t][i], end=' ')

        else:  # 纵向输出
            for i in range(t, m - t):
                print(s[i][t], end=' ')

    else:
        for i in range(t, m - t):
            print(s[i][t], end=' ')

        for i in range(t + 1, n - t):
            print(s[m - 1 -t][i], end=' ')

        for i in range(m - 2 - t, t - 1, -1):
            print(s[i][n - 1 - t], end=' ')

        for i in range(n - 2 - t, t, -1):
            print(s[t][i], end=' ')


龟兔赛跑预测

# 兔子 v1
# 乌龟 v2

v1, v2, t, s, L = map(int, input().split())
R_s = 0
T_s = 0

T_int = int(L / v2)

for i in range(1, T_int + 1):
    R_s += v1
    T_s += v2

    

    if R_s - T_s >= t and R_s < L:
        R_s = R_s - s * v1

    if R_s >= L and i != T_int:  # i != T_int 不加这句话,相等时也满足
        print("R")
        print(i)
        break
    
    if i == T_int and T_s == R_s:
        print("D")
        print(i)
    elif i == T_int and T_s > R_s:
        print("T")
        print(i)
        

芯片测试

n = int(input())
##print(n)
a = []
b = []
for i in range(n):
    a.append([i for i in map(int, input().split())])
# 每一列,多余一般测试为好芯片即为好芯片
for i in range(n):
    flag = 0
    for j in range(n):
        if a[j][i] == 1:
            flag += 1
    if flag >= int((n + 1) / 2):
        b.append(i + 1)

##print(b)
b.sort()
for t in range(len(b)):
    print(b[t], end=" ")

Sine之舞

def An(n):
    for i in range(1, n + 1):
       if i != n:
           print("sin(", i, sep='', end='')
           if i % 2 == 0:
               print("+",end='')
           else:
               print("-",end='')
       else:
           print("sin(", i, sep='', end='')

    for j in range(1, n + 1):
        print(')', end='')

    return ''  # 必须写,不然返回值就变成了 None
            

def Sn(n):
    for i in range(n - 1):
        print('(', end='')

    for i in range(1, n + 1):
        print(An(i),"+",(n - i + 1), sep='', end='')
        if n - i + 1 !=  1:
            print(')', end='')
        

n = int(input())
Sn(n)
       

递归斐波那契数列

"""递归斐波那契额数列"""


def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        return fib(n - 1) + fib(n - 2)


print(fib(3))

汉诺塔递归函数

shadow-image-20201015100753691

# A: source, B: target, C: helper
def hanoi(n, source, target, helper):  # move n Disk from A to B with the help of B
    if n == 1:  # 边界条件
        moveSingleDisk(source, target)
    else:  
        hanoi(n - 1, source, helper, target)  # move n-1 Disk from A to C with the help of B
        moveSingleDisk(source, target)  # 完成一个圆盘任务,其余仿照操作
        hanoi(n - 1, helper, target, source)  # move n-1 Disk from C to B with the help of A


def moveSingleDisk(source, target):
    disk = source[0].pop()  # source[0]是一个列表[3, 2, 1] 
    print("moving " + str(disk) + " from " + source[1] + " to " + target[1], sep=' ')
    target[0].append(disk)


if __name__ == "__main__":
    A = ([3, 2, 1], "A")  # 3个圆盘,数越大代表圆盘越大
    B = ([], "B")
    C = ([], "C")
    hanoi(len(A[0]), A, B, C)

数的读法

"""
该算法并非本人想出来,转载于另一位博客大神,
链接:https://blog.csdn.net/qq_37962204/article/details/79716058
"""
# 该程序蓝桥杯评分系统给 100 分, 但存在bug, 105010 并不能正确读出。
n = int(input())
a = ['ling', 'yi', 'er', 'san', 'si', 'wu', 'liu', 'qi', 'ba', 'jiu']
b = ['shi', 'bai', 'qian', 'wan', 'yi']
res = ['' for i in range(20)]
i, j = 0, 0
l = [0, 0]

while n:
    k, n = n % 10, int(n / 10)
    if k:
        if i >= 4 and l[int(i / 4) - 1] == 0:
            l[int(i / 4) - 1] = 1
            res[j], j = b[int(i / 4) + 2], j + 1
            
        if i % 4:
            res[j], j = b[int(i % 4) - 1], j + 1
            
        res[j] = a[k]
        j += 1
        
    elif j > 0 and res[j - 1] != a[0]:
        res[j], j = a[0], j + 1
    i += 1

if res[j - 1] != 'yi' or j <= 1 or res[j - 2] != 'shi':  # 控制第一位输出
    # 1.高位为一时,不输出。
    # 2.控制输出个位数。
    # 3.res[j - 2] != 'shi'可以控制百位为1时,可以输出一,如123,前两个都不满足,但 res[j - 2] != 'shi'满足,所以能够正确输出。
    print(res[j - 1], end=' ')
for i in range(j - 2, -1, -1):  # 从第二位输出
    print(res[i], end=' ')

完美的代价

N = int(input())
s = list(input())
count = 0  # 统计交换次数
flag = 0
i = 0
a = True
len = N - 1
while i < len:
    if a == False:
        break

    for j in range(len, i - 1, -1):
        if i == j:
            # N % 2 == 0时,说明是偶数,在i == j 时,才找到相同的,说明该数为单个存在,不可能对称
            # 当 N 为奇数时,首先执行下面 flag = 1的语句。如果再次进入到这儿,说明又一次,在i == j 时,
            # 才找到相同的,即单个存在数字不止一个,则根据 flag == 1 判断本串字符串不可能对称。
            if N % 2 == 0 or flag == 1:  # 如果 N 是奇数,第一次进不来,因为 flag = 0
                print('Impossible')
                a = False
                break
            flag = 1  # 标志位。到这一步,说明 N % 2 == 1 ,标志改数字为单个存在(只能把它放在中间位置)
            count += N // 2 -i  # 计算该数字移到中间位置所需要的交换次数
        elif s[i] == s[j]:
            for k in range(j, len):
                s[k], s[k + 1] = s[k + 1], s[k]
                count += 1
                
            len -= 1
            break
                
    i += 1
if a == True:
    print(count)

未完待续…………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值