python基础试题 (蓝桥杯省赛试题)


# 根据CSDN其他还有官网中的试题,进行练习,其中编写的试题代码也包括了自己的想法和思路,供大家参考,希望能跟大家多多交流,欢迎纠正。

1

1.1 Fibonacci数列题

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

输入描述:(输入格式输入包含一个整数n)

  • n

输出描述:(输出格式输出一行,包含一个整数)

  • 表示Fn除以10007的余数

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。 数据规模与约定1 <= n <= 1,000,000。

# 1.1 Fibonacci数列
n = int(input("输入包含一个整数:"))
# n = 10
fib = [1 for i in range(n+1)]
k = 3
while k <= n:
    fib[k] = (fib[k-1] +fib[k-2]) % 10007
    k += 1
print("第", n, "的数列除以10007余数为", fib[n])

1.2 圆的面积

问题描述:
给定圆的半径r,求圆的面积。

输入描述:(输入包含一个整数r)

  • 表示圆的半径 如:
    4

输出描述:(输出一行包含一个实数,四舍五入保留小数点后7位)

  • 表示圆的面积 如:
    50.2654825

数据规模与约定: 1 <= r <= 10000

# 1.2 圆的面积
import math
r = int(input("输入圆的半径:"))
s = math.pi * r * r
print("{:.7f}".format(s))

1.3 序列求和

问题描述:
求1+2+3+…+n的值。

输入描述:(输入包含一个整数n)

  • 4

输出描述:(输出一行包括一个整数,表示1+2+3+…+n的值)

  • 10

数据规模与约定: 1 <=n <= 1,000,000,000

# 1.3 序列求和
n = int(input("输入一个整数: "))
s = n * (n + 1) / 2 # 等差数列公式
print("序列和为: %d" %s)

1.4 A+B问题

问题描述:
输入A、B,输出A+B。

输入描述:(输入的第一行包括两个整数,由空格分隔,分别表示A、B)

  • 12 45

输出描述:(输出一行包括一个整数,表示表示A+B的值)

  • 57

数据规模与约定: -10000 <= A, B <= 10000

# 1.4 A+B问题
#只适用于数据规模较小的情况下。若过大,则通过大数加法计算
a, b = map(int, input("输入两个整数").split())
print(a+b)


2

2.1 数列排序

问题描述:
给定一个长度为n的数列,
将这个数列按从小到大的顺序排列。1<=n<=200

输入描述:
(第一行为一个整数n)
(第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000)

  • 5
    8 3 6 4 9

输出描述:(输出一行,按从小到大的顺序输出排序后的数列)

  • 3 4 6 8 9

# 2.1 数列排序 (即输入的第二行整数以空格间隔)
# 方法一:
n = int(input("输入数列长度: "))
num = list(map(int, input("输入待排序整数,整数的绝对值小于10000:").split()))
num.sort()  #None是不可迭代的    或者sorted(num)
print(" ".join("{:d}".format(i) for i in num ))

# 方法二:
num = input("输入待排序整数,整数的绝对值小于10000:").split()
num = sorted(num)    #list类型
print(" ".join(num[:n]))

2.2 进制转化

十六进制转八进制
问题描述:
给定n个十六进制正整数, 输出它们对应的八进制数

输入描述:
(输入的第一行为一个正整数n(1<=n<=10))
(接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000)

  • 2
    39
    123ABC

输出描述:(输出n行,每行为输入对应的八进制正整数)

  • 71
    4435274

【注意】输入的十六进制数不会有前导0,比如012A
输出的八进制数也不能有前导0

n = int(input("输入需转换的行数: "))
for i in range(1,n+1):
    print("第", i, "行")
    m = input("输入十六进制正整数: ")
    ans = format(int(m, 16), 'o')
    print(ans)
#十六进制转二进制
ans = format(int(m, 16), 'b')
十六进制转十进制
问题描述:
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示

输入描述:

  • FFFF

输出描述:

  • 65535

#十六进制转十进制
print(int(input("输入十六进制正整数: "), 16))
十进制转十六进制
问题描述:
十六进制数是在程序设计时经常要使用到的一种整数的表示方式. 它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
共16个符号,分别表示十进制数的0至15。
十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。给出一个非负整数,将它表示成十六进制的形式

输入描述: (输入包含一个非负整数a,表示要转换的数,0<=a<=2147483647)

  • 30

输出描述:(输出这个整数的16进制表示)

  • 1E

#十进制转十六进制
print(format(int(input("输入十进制正整数: ")), 'X'))

2.3 特殊回文数

问题描述:
123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n,编程求所有这样的五位和六位十进制数,满足各位数字之和等于n

输入描述:(输入的第一行包含一个正整数n)

  • 52

输出描述:(输出按从小到大的顺序输出满足条件的整数,每个整数占一行)

  • 899998
    989989
    998899

数据规模与约定: 1<=n<=54

# 2.3 特殊回文数
#方法一:
n = int(input("输入需得到回文数之和的整数: "))
#先判断是否为回文数  (方法一:特点按顺序:从10000,10001,10002,...,999999)
for i in range(10000, 1000000):
    num_pd = str(i)  #回文数
    if num_pd == num_pd[::-1]:
        sum_pd = 0
        #在单独求各个 位数字之和
        for j in num_pd:
            sum_pd += int(j)
        if sum_pd == n:
            print(num_pd)
#方法二:按照回文数顺序遍历,如:10001,20002,...,999999)
my_list = []
for i in range(100, 1000):
    num_pd_half = str(i) #回文数的前半部分,复制,对称处理 ,从而减少运算
    #回文数是五位数
    if sum(map(int, num_pd_half + num_pd_half[:2][::-1])) == n:  #三位数 + 三位数的前2位数 倒序
        my_list.append(num_pd_half + num_pd_half[::-1])
    #回文数是六位数
    if sum(map(int, num_pd_half + num_pd_half[::-1])) == n:    #三位数 + 三位数的倒序
        my_list.append(num_pd_half + num_pd_half[::-1])

for i in sorted(map(int, my_list)):
    print(i)
#方法三:
# ***** 绝绝子方法 *****
n = int(input())
for i in range(10000, 1000000):
    num_pd = str(i) #可能出现的回文数
#符合正序与倒序相等,同时将字符串以 + 分割并以eval()转化为表达式进行求值
    if num_pd == num_pd[::-1] and eval('+'.join(num_pd)) == n:
    #eval:***转化为有效的表达式 或 complie函数的代码对象(其可以创建函数compile(表达式,'','编译代码'))
        print(i)
四位数回文数
问题描述:
正着数和倒着数都一样,输出所有的这样的四位数
如 1221
#输出四位数的回文
# import time
# start = time.time()
num_list = []
for i in range(10, 101):  #两位数
    num_list.append(str(i) + str(i)[::-1])  #两位数 + 两位数的倒序
for l in map(int, num_list):
    print(l)
# print(time.time()-start)

2.4 水仙花数

问题描述:
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=111+555+333。
编程求所有满足这种条件的三位十进制数

输出描述:(按从小到大的顺序输出满足条件的三位十进制数,每个数占一行)

# 2.4 水仙花数
for i in range(100, 1000):
    # 个位十位百位数 各个立方,相加之和
    num_sum = int(str(i)[0]) ** 3 + int(str(i)[1]) ** 3 + int(str(i)[2]) ** 3
    if num_sum == i:
        print(i)

2.5 杨辉三角

问题描述:
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行

输入描述:(输入包含一个数n)

  • 4

输出描述:(输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格)

  • 1
    1 1
    1 2 1
    1 3 3 1

数据规模与约定: 1 <= n <= 34

# 2.5 杨辉三角
n = int(input("输入行数:"))

old_line = [1]    #打印第一列 1
print(' '.join(str(i) for i in old_line))
for i in range(1, n):   #打印第一列之后,第二列开始(从[1,1]开始)
    new_line = []       #创建新列表
    for j in range(len(old_line)-1):  #打印第二列之后,第三列开始(从[1,2,1]开始)
        new_line.append(old_line[j] + old_line[j+1])  #添加的数据,(从[1]+[1]: 1+1 = 2开始)
    # 添加新列表中的参数   *表示:将列表解开成多个独立的参数
    new_line = [1, *new_line, 1]

    print(' '.join(str(i) for i in new_line))


2.6 查找整数

问题描述:
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个

输入描述:
(第一行包含一个整数n)
(第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000)
(第三行包含一个整数a,为待查找的数)

  • 6
    1 9 4 8 3 9
    9

输出描述:(输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格)

  • 2

数据规模与约定: 1 <= n <= 1000

# 2.6 查找整数, 输入含有n个整数的数列a,搜索整数m在a数列中的数量
n = int(input("输入数列中整数的数量: "))
a = input("输入数列: ").split()
m = input("输入待查的整数: ")
num = 0
##方法缺n值
for j in range(n):
    if a[j] == str(m):  #按顺序搜索数列中的整数
        num += 1
if num == 0:
    print(-1)
else:
    print("出现的次数为: ", num)


2.7 数列特征

问题描述:
给出n个数,找出这n个数的最大值,最小值,和

输入描述:
(第一行为整数n,表示数的个数)
(第二行有n个数,为给定的n个数,每个数的绝对值都小于10000)

  • 5
    1 3 -2 4 5

输出描述:(输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和)

  • 5
    -2
    11

数据规模与约定: 1 <= n <= 1000

# 2.7 数列特征
n = int(input("输入整数的个数: "))
m = input("输入数列: ").split()
# max(),min()函数,对于列表取最大/小的数字,
# 对于字符串取最大/小的字母(如:"1,2,3" --> 逗号最小), 其他的与字符串同理

if n == len(m):
    print("最大数值为:", max(m))  #求最大数值
    print("最小数值为:", min(m))  #求最小数值
    print("最小值为:", eval("+".join(m))) #求和


2.8 字母图形

问题描述:
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形

输入描述:(输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数)

  • 5 7

输出描述:(输出n行,每个m个字符,为你的图形)

  • ABCDEFG
    BABCDEF
    CBABCDE
    DCBABCD
    EDCBABC

数据规模与约定: 1 <= n, m <= 26

# 2.8 字母图形
try:
    n, m = map(int, input("请输入需输出的行数 、列数: ").split())
    letter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    output = letter[:m]    #初始为m列的第一行列表
    for i in range(1, n+1):
        print(output)
        output = letter[i] + output[:-1]  #重新赋值第二列列表之后的数列
        #为字母表第n个为字母列的首字母 + 前一行除最后一位数的字母列
except:
    pass


2.9 字串01

问题描述:
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串

输出描述:(输出32行,按从小到大的顺序每行一个长度为5的01串)

  • 00000
    00001
    00010
    00011

数据规模与约定: 1 <= n, m <= 26

# 2.9 字串01
for i in range(32):
    print("{:0>5}".format(format(i, 'b')))
    

2.10 闰年判断

问题描述:
给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年:
年份是4的倍数而不是100的倍数;年份是400的倍数。
其他的年份都不是闰年。

输入描述:(输入包含一个整数y,表示当前的年份)

  • 2013

  • 2016

输出描述:(输出一行,如果给定的年份是闰年,则输出yes,否则输出no)

  • no

  • yes

数据规模与约定: 1990 <= y <= 2050

#  2.10 闰年判断
n = int(input("输入年份: "))
if n % 4 == 0 and n % 100 != 0 or n % 400 == 0:
    print("yes")
else:
    print("no")
    

[1]: 试题题目部分来自于 https://blog.csdn.net/qq_31910669

猜你喜欢

转载自blog.csdn.net/Fuziqp/article/details/116431536
今日推荐