蓝桥杯练习题(三):Python组之算法训练提高综合五十题

1.字符串合并

  • 问题描述:输入两个字符串,将其合并为一个字符串后输出。

  • 输入格式:输入两个字符串

  • 输出格式:输出合并后的字符串

  • 样例输入
    一个满足题目要求的输入范例。
    Hello
    World

  • 样例输出:HelloWorld

具体代码:

x = input()
y = input()
print(x+y)

运行结果:
在这里插入图片描述

2.数据交换

  • 问题描述
    编写一个程序,输入两个整数,分别存放在变量x和y当中,然后使用自己定义的函数swap来交换这两个变量的值。

  • 要求:主函数负责数据的输入与输出,但不能直接交换这两个变量的值,必须通过调用单独定义的函数swap来完成,而swap函数只负责交换变量的值,不能输出交换后的结果。

  • 输入格式:输入只有一行,包括两个整数。

  • 输出格式:输出只有一行,也是两个整数,即交换以后的结果。

  • 样例输入
    4 7

  • 样例输出:7 4

具体代码:

def swap(x,y):
    return y,x

if __name__ == '__main__':
    x,y=list(map(int,input().split()))
    x,y = swap(x,y)
    print(x,y)

运行结果:
在这里插入图片描述

3.二进制数数

  • 问题描述
    给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。
    如5的二进制为101,包含2个“1”。

  • 输入格式:第一行包含2个数L,R

  • 输出格式:一个数S,表示[L,R]区间内的所有数在二进制下包含的“1”的个数之和。

  • 样例输入
    2 3

  • 样例输出:3

具体代码:

def sum_er(n):
    n_er=format(n,'b')
    A=Counter(n_er)
    B=A['1']
    return B
if __name__ == '__main__':
	from collections import Counter
    x,y=list(map(int,input().split()))
    result=0
    for i in range(x,y+1):
        result+=sum_er(i)
    print(result)

运行结果:
在这里插入图片描述

4.大等于n的最小完全平方数

  • 问题描述
    输出大等于n的最小的完全平方数。若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数
    Tips:注意数据范围
  • 输入格式:一个整数n
  • 输出格式:大等于n的最小的完全平方数
  • 样例输入:71711
  • 样例输出:71824
  • 数据规模和约定:n是32位有符号整数
  • 思路:如果输入的数小于等于0,那么直接输出0即可,如果输入的数大于0,那么用暴力循环,找到第一个大于输入的数就使用break退出循环。

具体代码:

def pre_squ(x):
    if x<=0:
        return 0
    for i in range(x):
        if i**2>=x:
            return i**2
if __name__ == '__main__':
    x=int(input())
    result=pre_squ(x)
    print(result)

运行结果:
在这里插入图片描述

5.素因子去重

  • 问题描述:给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
  • 输入格式:一个整数,表示n
  • 输出格式:输出一行,包含一个整数p
  • 样例输入:1000
  • 样例输出:10
  • 数据规模和约定: n<=10^12
    样例解释:n=1000=2^353,p=2*5=10
  • 思路:先找出素数,在根据里面重复的数来进行取舍

具体代码:

def factorization(x):
    factor=[]
    while x>1:
        for i in range(x-1):
            k=i+2
            if x%k==0:
                factor.append(k)
                x=int(x/k)
                break
    return factor

def reduce_after(y):
    r=[]
    for i in range(0,len(y)):
        if y[i]==y[i-1]:
            continue
        else:
            r.append(y[i])
    totle=1
    for i in range(len(r)):
        totle *= r[i]
    return totle

if __name__ == '__main__':
    x=int(input())
    factor=factorization(x)
    result=reduce_after(factor)
    print(result)

运行结果
在这里插入图片描述

5.排序

  • 问题描述:编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。
      输入格式:输入只有一行,即三个整数,中间用空格隔开。
      输出格式:输出只有一行,即排序后的结果。
      输入输出样例
  • 样例输入:9 2 30
  • 样例输出:30 9 2

具体代码:

x=list(map(int,input().split()))
x.sort(reverse=True)
for i in range(len(x)):
    print(x[i],end=' ')

运行结果
在这里插入图片描述

6.预测身高

  • 问题描述
    生理卫生老师在课堂上娓娓道来:
    你能看见你未来的样子吗?显然不能。但你能预测自己成年后的身高,有公式:
    男孩成人后身高=(父亲身高+母亲身高)/21.08
    女孩成人后身高=(父亲身高
    0.923+母亲身高)/2
    数学老师听见了,回头说:这是大样本统计拟合公式,准确性不错。
    生物老师听见了,回头说:结果不是绝对的,影响身高的因素很多,比如营养、疾病、体育锻炼、睡眠、情绪、环境因素等。
    老师们齐回头,看见同学们都正在预测自己的身高。
    毛老师见此情形,推推眼镜说:何必手算,编程又快又简单…
    约定:
    身高的单位用米表示,所以自然是会有小数的。
    男性用整数1表示,女性用整数0表示。
    预测的身高保留三位小数
  • 输入格式:用空格分开的三个数,整数 小数 小数分别表示:性别 父亲身高 母亲身高
  • 输出格式:一个小数,表示根据上述表示预测的身高(保留三位小数)
  • 样例输入:1 1.91 1.70
  • 样例输出:1.949
  • 样例输入:0 1.00 2.077
  • 样例输出:1.500
  • 数据规模和约定
    父母身高范围(0,3]
    时间限制1.0秒

具体代码:

s,f,m=list(map(float,input().split()))
if s==1:
    high=(f+m)/2*1.08
else:
    high=(f*0.923+m)/2
print('%.3f'%high)

运行结果
在这里插入图片描述

7.最大质因数

  • 问题描述:给出N个数字,求出有最大的最大质因数的那个数
  • 输入格式:第一行:一个整数N。接下来的N行,每行一个整数A_i,表示给出的那N个数字。
  • 输出格式:第一行:一个整数,拥有最大的最大质因数的那个数。
  • 样例输入
    4
    36
    38
    40
    42
  • 样例输出:38
  • 数据规模和约定
    60%的数据满足:N<=100
    100%的数据满足:N<=2500,A_i<=20000

具体代码:(这段代码能完美运行上面蓝桥杯这道题上的所有案列 但是编译就是不通过 很难受QAQ)

def factor(x):
    a=[]
    while x>1:
        for i in range(0,x-1):
            k=i+2
            if x%k==0:
                a.append(k)
                x=int(x/k)
                break
    return a
def sum_fac(y):
    sum=0
    for i in range(len(y)):
        sum+=y[i]
    return sum

if __name__ == '__main__':
    import numpy as np
    n=int(input())
    start=[]
    sum_ave=[]
    for i in range(n):
        a=int(input())
        start.append(a)
        b=factor(a)
        sum=sum_fac(b)
        sum_ave.append(sum)
    max=np.argmax(sum_ave)
    print(start[max])

运行结果:
在这里插入图片描述

8.首字母变大写

  • 问题描述:对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。在字符串中,单词之间通过空白符分隔,空白符包括:空格(’ ‘)、制表符(’\t’)、回车符(’\r’)、换行符(’\n’)
  • 输入格式:输入一行:待处理的字符串(长度小于80)
  • 输出格式:输出一行:转换后的字符串。
  • 样例输入:if so, you already have a google account. you can sign in on the right.
  • 样例输出:If So, You Already Have A Google Account. You Can Sign In On The Right.

具体代码:

# 将字符串中所有单词首字母大写  string.capwords()==title
import string
n=input()
# print(n.title())
print(string.capwords(n))

运行结果:
在这里插入图片描述

9.字符串排序

  • 问题描述:输入一个小写字符串,按从小到大的顺序输出。
  • 输入格式:bcaed
  • 输出格式:abcde 顶格输出,中间没有空格
  • 样例输入:一个满足题目要求的输入范例。
    例:
    bcaed
  • 样例输出:与上面的样例输入对应的输出。
    例:
    abcde

具体代码:

n=input()
num=len(n)
fil=[]
for i in range(num):
    fil.append(n[i])
fil.sort()
for j in range(num):
    print(fil[j],end='')

运行结果:
在这里插入图片描述

10.复数求和

  • 问题描述:从键盘读入n个复数(实部和虚部都为整数)用链表存储,遍历链表求出n个复数的和并输出。
  • 样例输入
    3
    3 4
    5 2
    1 3
  • 样例输出:9+9i
  • 样例输入
    7
    1 2
    3 4
    2 5
    1 8
    6 4
    7 9
    3 7
  • 样例输出:23+39i

具体代码:

n=int(input())
a_sum=0
b_sum=0
for i in range(n):
    a,b=list(map(int,input().split()))
    a_sum+=a
    b_sum+=b
print(a_sum,'+',b_sum,'i',sep='',end='')

运行结果:
在这里插入图片描述

11.成绩的等级输出

  • 问题描述:输入一个百分制的成绩t后,按下式输出它的等级。等级为:90-100为A,80-89为B,70-79为C,60-69为D,0-59为E。
  • 样例输入:98
  • 样例输出:A

具体代码:

def rank(x):
    if x>=90 and x<=100:
        return 'A'
    elif x>=80 and x<=89:
        return 'B'
    elif x>=70 and x<=79:
        return 'C'
    elif x>=60 and x<=69:
        return 'D'
    else:
        return 'E'
if __name__ == '__main__':
    n=float(input())
    print(rank(n))

运行结果:
在这里插入图片描述

12.成绩排序

  • 问题描述:用一维数组存储学号和成绩,然后,按成绩排序输出。
  • 输入格式:输入第一行包括一个整数N(1<=N<=100),代表学生的个数。接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。
  • 输出格式:按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
    如果学生的成绩相同,则按照学号的大小进行从小到大排序。
  • 样例输入
    3
    1 90
    2 87
    3 92
  • 样例输出
    2 87
    1 90
    3 92

具体代码:

n = int(input())
inf=[]
for i in range(n):
    information = tuple(input().split()) # 得到元组
    inf.append(information)
    # 后排成绩,从大到小 传递给key参数的是一个函数,它指定可迭代对象中的每一个元素来按照该函数进行排序
inf.sort(key=lambda x:x[1])

for i in range(n):
    print(inf[i][0],inf[i][1])

运行结果:
在这里插入图片描述

13.字符串跳步

  • 问题描述
    给定一个字符串,你需要从第start位开始每隔step位输出字符串对应位置上的字符。
  • 输入格式:第一行一个只包含小写字母的字符串。第二行两个非负整数start和step,意义见上。
  • 输出格式:一行,表示对应输出。
  • 样例输入
    abcdefg
    2 2
  • 样例输出
    ceg
  • 数据规模和约定:start从0开始计数。字符串长度不超过100000。

具体代码:

n = input()
m1,m2=list(map(int,input().split()))
print(n[m1:len(n)+1:m2]) #n[start:end:interval]

运行结果:
在这里插入图片描述

14.字符串匹配

  • 问题描述
    给出一个字符串和多行文字,在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感选项:当选项打开时,表示同一个字母的大写和小写看作不同的字符;当选项关闭时,表示同一个字母的大写和小写看作相同的字符。
  • 输入格式:输入的第一行包含一个字符串S,由大小写英文字母组成。
    第二行包含一个数字,表示大小写敏感的选项,当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
    第三行包含一个整数n,表示给出的文字的行数。
    接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。
  • 输出格式:输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串S的行。
  • 样例输入
    Hello
    1
    5
    HelloWorld
    HiHiHelloHiHi
    GrepIsAGreatTool
    HELLO
    HELLOisNOTHello
  • 样例输出
    HelloWorld
    HiHiHelloHiHi
    HELLOisNOTHello
  • 数据规模和约定:1<=n<=100,每个字符串的长度不超过100。

具体代码:

start = input()
is_switch=int(input())
n=int(input())
result=[]
cout=0
for i in range(1,n+1):
    s_input=input()
    if is_switch==1:
        if start in s_input:
            cout+=1
            result.append(s_input)
    else:
        if start.upper() in s_input.upper():
            cout+=1
            result.append(s_input)
for i in range(cout):
    print(result[i])

运行结果:
在这里插入图片描述

15.寻找数组中最大值

  • 问题描述
    对于给定整数数组a[],寻找其中最大值,并返回下标。
  • 输入格式:整数数组a[],数组元素个数小于1等于100。输出数据分作两行:第一行只有一个数,表示数组元素个数;第二行为数组的各个元素。
  • 输出格式:输出最大值,及其下标
  • 样例输入
    3
    3 2 1
  • 样例输出
    3 0

具体代码:

n=int(input())
arr=list(map(int,input().split()))
arr1=[i for i in range(n)]
# print(arr)
# print(arr1)
max=0
max_idex=0
for i in range(n):
    if arr[i]>max:
        max=arr[i]
        max_idex=i
print(max,max_idex)

运行结果:
在这里插入图片描述

16.九九乘法表正三角和倒三角

  • 问题描述
    通过合理的编程来实现九九乘法表,包括正三角和倒三角的形态
  • 输出格式
1 * 9 = 9   2 * 9 = 18  3 * 9 = 27  4 * 9 = 36  5 * 9 = 45  6 * 9 = 54  7 * 9 = 63  8 * 9 = 72  9 * 9 = 81 
1 * 8 = 8   2 * 8 = 16  3 * 8 = 24  4 * 8 = 32  5 * 8 = 40  6 * 8 = 48  7 * 8 = 56  8 * 8 = 64 
1 * 7 = 7   2 * 7 = 14  3 * 7 = 21  4 * 7 = 28  5 * 7 = 35  6 * 7 = 42  7 * 7 = 49 
1 * 6 = 6   2 * 6 = 12  3 * 6 = 18  4 * 6 = 24  5 * 6 = 30  6 * 6 = 36 
1 * 5 = 5   2 * 5 = 10  3 * 5 = 15  4 * 5 = 20  5 * 5 = 25 
1 * 4 = 4   2 * 4 = 8   3 * 4 = 12  4 * 4 = 16 
1 * 3 = 3   2 * 3 = 6   3 * 3 = 9 
1 * 2 = 2   2 * 2 = 4 
1 * 1 = 1 
1 * 1 = 1
1 * 2 = 2   2 * 2 = 4
1 * 3 = 3   2 * 3 = 6   3 * 3 = 9
1 * 4 = 4   2 * 4 = 8   3 * 4 = 12  4 * 4 = 16
1 * 5 = 5   2 * 5 = 10  3 * 5 = 15  4 * 5 = 20  5 * 5 = 25
1 * 6 = 6   2 * 6 = 12  3 * 6 = 18  4 * 6 = 24  5 * 6 = 30  6 * 6 = 36
1 * 7 = 7   2 * 7 = 14  3 * 7 = 21  4 * 7 = 28  5 * 7 = 35  6 * 7 = 42  7 * 7 = 49
1 * 8 = 8   2 * 8 = 16  3 * 8 = 24  4 * 8 = 32  5 * 8 = 40  6 * 8 = 48  7 * 8 = 56  8 * 8 = 64
1 * 9 = 9   2 * 9 = 18  3 * 9 = 27  4 * 9 = 36  5 * 9 = 45  6 * 9 = 54  7 * 9 = 63  8 * 9 = 72  9 * 9 = 81

具体代码:

for i in range(-9,0):
    for j in range(1,10):
        if(j==i*(-1)):
            print(j,'*',i*(-1),'=',i*j*(-1),end=' ')
            print( )
            break
        else:
            if (i * j *(-1) > 9):
                print(j, "*",i*(-1), "=", i * j *(-1), end="  ")
            else:
                print(j, "*",i*(-1), "=", i * j * (-1), end="   ")

for i in range(1,10):
    for j in range(1,i+1):
        if i == j :
            print(j,'*',i,'=',i*j,end='')
            print()
        else:
            if i*j>9:
                print(j,'*',i,'=',i*j,end='  ')
            else:
                print(j,'*',i,'=',i*j,end='   ')

运行结果:
在这里插入图片描述

17.质数2

  • 问题描述
    给定一个正整数N,请你输出N以内(不包含N)的质数以及质数的个数。
  • 输入格式:输入一行,包含一个正整数N。
  • 输出格式:共两行。第1行包含一个整数,表示N以内质数的个数。第2行包含若干个素数,每两个素数之间用一个空格隔开,素数从小到大输出。
  • 样例输入
    10
  • 样例输出
    4
    2 3 5 7

具体代码:

def is_prime(num):
    for i in range(2,num):
        if num%i==0:
            return False
    return True
if __name__ == '__main__':
    i=2
    n=int(input())
    cout=0
    totle=[]
    for i in range(2,n):
        # if is_hui(i):
        #     print(i)
        if is_prime(i):
            cout+=1
            totle.append(i)
    print(cout)
    for i in range(cout):
        print(totle[i],end=' ')

运行结果:
在这里插入图片描述

18.利息计算

  • 问题描述
    编制程序完成下述任务:接受两个数,一个为用户一年期定期存款金额,一个为按照百分比格式表示的利率;程序计算一年期满后本金与利息总额。说明:(1)存款金额以人民币元为单位,可能精确到分;(2)输入利率时不需要输入百分号,例如一年期定期存款年利率为2.52%,用户输入2.52即可;(3)按照国家法律,存款利息所得需缴纳20% 的所得税,计算结果时所得税部分应扣除。
  • 输入格式:输入一行,包含两个实数,分别表示本金和年利率。
  • 输出格式:输出一行,包含一个实数,保留到小数点后两位,表示一年后的本金与利息和。
  • 样例输入
    10000 2.52
  • 样例输出
    10201.60

具体代码:

n,m=list(map(float,input().split()))
earn=n*(m/100)*0.8
whole_money=n+earn
print('%.2f'%whole_money)

运行结果:
在这里插入图片描述

19.进制转换

  • 问题描述
    程序提示用户输入三个字符,每个字符取值范围是0-9,A-F。然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制,十进制,八进制输出。
  • 输入格式:输入只有一行,即三个字符。
  • 输出格式:输出只有一行,包括三个整数,中间用空格隔开。
  • 样例输入
    FFF
  • 样例输出
    FFF 4095 7777

具体代码:

x=input()
b=int(x,16) #10
a=format(b,'X') #16
c=format(b,'o') #8
print(a,b,c,end='')

运行结果:
在这里插入图片描述

20.前十名

  • 问题描述
    数据很多,但我们经常只取前几名,比如奥运只取前3名。现在我们有n个数据,请按从大到小的顺序,输出前10个名数据。
  • 输入格式:两行。第一行一个整数n,表示要对多少个数据;第二行有n个整数,中间用空格分隔。表示n个数据。
  • 输出格式:一行,按从大到小排列的前10个数据,每个数据之间用一个空格隔开。
  • 样例输入
    26
    54 27 87 16 63 40 40 22 61 6 57 70 0 42 11 50 13 5 56 7 8 86 56 91 68 59
  • 样例输出
    91 87 86 70 68 63 61 59 57 56

具体代码:

x=int(input())
arr=list(map(int,input().split()))
arr.sort(reverse=True)
for i in range(0,x):
    if i<10:
        print(arr[i],end=' ')

运行结果:
在这里插入图片描述

21.数组求和

  • 问题描述
    输入n个数,围成一圈,求连续m(m<n)个数的和最大为多少?
  • 输入格式:输入的第一行包含两个整数n, m。第二行,共n个整数。
  • 输出格式:输出1行,包含一个整数,连续m个数之和的最大值。
  • 样例输入
    10 3
    9 10 1 5 9 3 2 6 7 4
  • 样例输出
    23

具体代码:

n,m=list(map(int,input().split()))
arr=list(map(int,input().split()))
arr2=arr+arr
sum1=0
sum2=0
for i in range(0,n):
    for j in range(int(i),int(i)+m):
        sum2+=arr2[j]
    if sum1<sum2:
        sum1=sum2
    sum2=0
print(sum1)

运行结果:
在这里插入图片描述

22.身份证排序

  • 问题描述
    安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码大小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位
  • 输入格式:第一行一个整数n,表示有n个身份证号码余下的n行,每行一个身份证号码。
  • 输出格式:按出生日期从大到小排序后的身份证号,每行一条
  • 样例输入
    6
    466272307503271156
    215856472207097978
    234804580401078365
    404475727700034980
    710311408803093165
    710351408803093165
  • 样例输出
    404475727700034980
    234804580401078365
    215856472207097978
    710351408803093165
    466272307503271156
  • 数据规模和约定: n<=100000
  • 思路:这里会用到operator库中的itemgetter()函数,你可以通过指定二维列表中的下标来决定列表排序时的参照值时哪一个

具体代码:

from operator import itemgetter
n=int(input())
number=[]
for i in range(n):
    a=input()
    number.append([int(a[6:14]),int(a)])
number.sort(key=itemgetter(0,1),reverse=True) # 根据0和1dim的位置进行排序 这个意思是说如果0dim不能排出来,那我们根据1dim来进行排序
print(number)
for i in number:
    print(i[1])

运行结果:
在这里插入图片描述

23.出现次数最多的整数

  • 问题描述
    编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
  • 输入格式:第一行是一个整数N,N £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
  • 输出格式:输出只有一行,即出现次数最多的那个元素值。
  • 样例输入
    5
    100
    150
    150
    200
    250
  • 样例输出
    150

具体代码:

from collections import Counter
n=int(input())
a_arr=[]
for i in range(n):
    a=int(input())
    a_arr.append(a)
if n==0:
    print()
elif n<0:
    print()
else:
    a=Counter(a_arr)
    b=a.most_common(1)[0][0]
    # print(a)
    print(b)

运行结果:

24.测试输入数类型

  • 问题描述
    输入一个整数,判断是否是偶数
  • 输入格式:输入一个整数
  • 输出格式:输出判断结果,YES 或者 NO
  • 样例输入:0
  • 样例输出:YES
  • 样例输入:-1
  • 样例输出:NO

具体代码:

n=int(input())
if abs(n)%2==0:
    print('YES')
else:
    print('NO')

运行结果:
在这里插入图片描述

25.删除排序数组中的重复项

  • 问题描述
    输入一串数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
    不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
  • 输入格式:输入两个整数
  • 输出格式:删除排序数组中的重复项并按照逐个输出
  • 样例输入:10 12
  • 样例输出:2 3 5
  • 样例输入:30 55
  • 样例输出:2 3 5 11
  • 思路:先找到输入两个数的分解的全部质数,然后结合它们的质数,通过np.unique来直接输出无重复的数

具体代码:

def factory(x):
    factor=[]
    if x<10:
        factor.append(x)
    else:
        while x>1:
            for i in range(n-1):
                k=i+2
                if x%k==0:
                    factor.append(k)
                    x=int(x/k)
                    break
    return factor


import numpy as np
n,m=list(map(int,input().split()))
arr_a=factory(n)
arr_b=factory(m)
new_arr=arr_a+arr_b
# print(new_arr)
x=np.unique(new_arr)
# print(x)
sum=1
for i in range(len(x)):
    print(x[i],end=' ')
# print(sum)


运行结果:
在这里插入图片描述

26.5-1最小公倍数

  • 问题描述
    编写一函数lcm,求两个正整数的最小公倍数。
  • 输入格式:输入两个整数
  • 输出格式:输出这两个正整数的最小公倍数
  • 样例输入:3 5
  • 样例输出:15

具体代码:

n,m=list(map(int,input().split()))
n1=n
m1=m
while m1:
    n1,m1=m1,n1%m1 # n为最大公约数
x=n*m//n1
print(x)

运行结果:
在这里插入图片描述

28.最大最小公倍数()

  • 问题描述
    已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
  • 输入格式:输入一个正整数N。
  • 输出格式:输出一个整数,表示你找到的最小公倍数。
  • 样例输入:9
  • 样例输出:504

具体代码:

N = int(input())
if N<=2:
    print(N)
elif N%2==1:
    print(N*(N-1)*(N-2))
else:
    if N%3 == 0:
        print((N-1)*(N-2)*(N-3))
    else:
        print(N*(N-1)*(N-3))

运行结果:
在这里插入图片描述

28.数字分组

  • 问题描述:输入任意10个浮点数,根据它们的聚集程度划分为3组,输出每一组的平均值。提供老师上课讲的一种思路:将10个数字进行在数轴上排序,然后计算每两个点间的距离,在所有的距离中选取两个最大距离处断开,这样就把10个数字分为了3组。本题难度较大,如果深入讨论会比较复杂,大家可以只考虑如下面样例所示的分组情况非常简单的情况,只要简单情况能够成功计算,本题就能得分。另外,本题内容有些超前,推荐大家自学一下数组那一章中第一节一维数组,然后使用一维数组来做。排序算法可以参考trustie平台上传的冒泡排序法参考资料。
  • 输入格式:十个待输入的浮点数,使用空格隔开
  • 输出格式:三组数的平均数,每输出一个需要换行
  • 样例输入:50.4 51.3 52.3 9.5 10.4 11.6 19.1 20.8 21.9 49.6
  • 样例输出
    10.5
    20.6
    50.9
  • 样例输入:8.6 7.4 3.5 17.9 19.1 18.5 37.6 40.4 38.5 40.0
  • 样例输出
    6.5
    18.5
    39.125

具体代码:

def avg(list):
    sum=0
    for i in range(len(list)):
        sum+=list[i]
    return sum/len(list)

def spilt(list):
    key_number=[]
    for i in range(len(list)-1):
        if int(list[i])+5.0>int(list[i+1]):
            continue
        else:
            key_number.append(list.index(list[i])) # 返回关键分割点索引位置
    return key_number

if __name__ == '__main__':
    arr=list(map(float,input().split()))
    arr.sort(reverse=False)
    # print(arr)
    key_number=spilt(arr)
    arr_1=arr[:int(key_number[0])+1]
    arr_2=arr[int(key_number[0])+1:int(key_number[1])+1]
    arr_3=arr[int(key_number[1]) + 1:]
    # print(arr_1)
    # print(arr_2)
    # print(arr_3)
    result=[]
    result_1=avg(arr_1)
    result_2=avg(arr_2)
    result_3=avg(arr_3)
    result.append(result_1)
    result.append(result_2)
    result.append(result_3)
    result.sort()
    if result[0]<10:
        for i in range(len(result)):
            print(result[i])
    else:
        for i in range(len(result)):
            print('%.1f'%result[i])

运行结果:
在这里插入图片描述

29.整商问题

  • 问题描述
    提示用户输入被除数(dividend)和除数(divisor),若除数为0,则提示用户重新输入,直至除数非零为止。最后输出商。程序建议大家将被除数、除数和商都定义为整形。
      输入被除数提示语句为:Please enter the dividend:
      输入除数提示语句为:Please enter the divisor:
      提示除数为0需要重新输入的语句为: Error: divisor can not be zero! Please enter a new divisor:
      建议:大家直接复制上述语句,以免出现不必要的错误。
  • 输入格式:被除数 除数 。 注:若除数为零,则需要连续输入除数直至其非零为止。
  • 输出格式:提示性语句 商 。注意每个提示性语句输出后需要换行,具体参考下面的样例输出。
  • 样例输入
    一个满足题目要求的输入范例。
    例1:
    10 2
    例2:
    20 0 0 4
  • 样例输出
    与上面的样例输入对应的输出。
    例1:
    Please enter the dividend:
    Please enter the divisor:
    5
    例2:
    Please enter the dividend:
    Please enter the divisor:
    Error: divisor can not be zero! Please enter a new divisor:
    Error: divisor can not be zero! Please enter a new divisor:
    5

具体代码:

arr=list(map(int,input().split()))
a=arr[0]
b=arr[1:]
c=0
print('Please enter the dividend:')
print('Please enter the divisor:')
for i in range(len(b)):
    if b[i]==0:
        print('Error: divisor can not be zero! Please enter a new divisor:')
        continue
    else:
        c=b[i]
print(a//c)

运行结果:
在这里插入图片描述

30.1的个数

  • 问题描述
    输入正整数n,判断从1到n之中,数字1一共要出现几次。例如1123这个数,则出现了两次1。例如15,那么从1到15之中,一共出现了8个1。
  • 输入格式:一个正整数n
  • 输出格式:一个整数,表示1出现的资料
  • 样例输入:15
  • 样例输出:8

具体代码:

def sum_1(n):
    n=str(n)
    cout=0
    # print(len(n))
    list = []
    for i in range(len(n)):
        list.append(n[i])
    A=Counter(list)
    return A['1']

from collections import Counter
if __name__ == '__main__':
    n=int(input())
    cout_sum=0
    for i in range(0,n+1):
        a=sum_1(i)
        cout_sum+=a
    print(cout_sum)

运行结果:
在这里插入图片描述

31.图形显示

  • 问题描述
    编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数):
      * * * * *
      * * * *
      * * *
      * *
      *

具体代码:

n=int(input())
for i in range(n,0,-1):
    print('* ' * i)

运行结果:
在这里插入图片描述

31.比大小

  • 问题描述
    输入n个字符串,比较这些字符串的大小并统计并按字典序输出字符串及出现个数
  • 输入格式:输入的第一行包含一个整数n,表示字符串个数。接下来n行,表示输入的字符串。
  • 输出格式:输出n行,每行包含一个字符串及一个整数,表示字符串及出现个数。
  • 样例输入
    5
    aab
    bbc
    aab
    sdffg
    sgjklsa
  • 样例输出
    aab 2
    bbc 1
    sdffg 1
    sgjklsa 1
  • 下面我写的代码明明可以输出得到样例输出,但是一直不通过,我也有点疑惑,代码在下面供大家参考

具体代码:

from collections import Counter
n=int(input())
arr=[]
for i in range(n):
    a=input()
    arr.append(a)
x=Counter(arr)
a=int(len(x))
new=x.most_common(a)
# print(a)
# print(new)
for i in new:
    # print(i)
    for j in range(2):
        print(i[j],end=' ')
    print()

运行结果:
在这里插入图片描述

32:抽卡游戏

  • 问题描述:某个抽卡游戏卡池抽出限定卡的概率为p,该游戏有一个“井”的机制,抽满k次卡后直接送这张限定卡。试求获得这张限定卡需要的期望抽卡次数。输入为一行,用空格隔开的p和k。输出为一行,即期望抽卡次数,取2位小数
  • 样例输入:0.005 250
  • 样例输出:142.88
  • 样例说明
    第1次抽到的概率为0.005
    第2次抽到的概率为(1-0.005)0.005
    第n次抽到的概率为(1-0.005)^(n-1)0.005
    第250抽到的概率为之前都没有抽到的概率,即(1-0.005)^249
    最终结果
    1
    0.005+2
    (1-0.005)0.005+…+n(1-0.005)**(n-1)×0.005+…+250×(1-0.005)**249=142.88

具体代码:

def cal(n,m):
    a=m*pow(1-n,m-1)*n
    return a
sum=0
n,m=list(map(float,input().split()))
for i in range(1,int(m)):
    sum+=cal(n,i)
sum1=m*pow(1-n,m-1)
sum_totle=sum1+sum
print('%.2f'%sum_totle)

运行结果:
在这里插入图片描述

33:矩阵转置

  • 问题描述:给定一个n×m矩阵相乘,求它的转置。其中1≤n≤20,1≤m≤20,矩阵中的每个元素都在整数类型(4字节)的表示范围内。
  • 输入格式:第一行两个整数n和m;第二行起,每行m个整数,共n行,表示n×m的矩阵。数据之间都用一个空格分隔。
  • 输出格式:共m行,每行n个整数,数据间用一个空格分隔,表示转置后的矩阵。
  • 样例输入:
    2 4
    34 76 -54 7
    -4 5 23 9
  • 样例输出:
    34 -4
    76 5
    -54 23
    7 9

具体代码:(对了90%)

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""方法1""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
# 生成“竖排列表”
def vertical(list):
    o=[]
    for i in range(r):
        e=[]
        for j in list:
            e.append(j[i])
        o.append(e)
    return o
#print(vertical(start))

n,m=list(map(int,input().split()))
initial_arr=[]
if n<m:
    max=m
    min=n
else:
    max=n
    min=m
for i in range(max):
    initial_arr.append(input().split())
# print(initial_arr)
new_arr=[]
for i in range(min):
    e=[]
    for j in initial_arr:
        e.append(j[i])
    new_arr.append(e)
# print(new_arr)
for k in new_arr:
    for l in range(max):
        print(k[l],end=' ')
    print()
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""方法2"""""""""""""
n,m=list(map(int,input().split()))
initial_arr=[]
for i in range(n):
    initial_arr.append(input().split())
new=list(map(list,zip(*initial_arr)))
for i in new:
    for j in i:
        print(j,end=' ')
    print()

运行结果:
在这里插入图片描述

34:数字三角形

  • 问题描述:
    在这里插入图片描述
  • 输入格式
     文件中首先读到的是三角形的行数。
     接下来描述整个三角形
  • 输出格式:最大总和(整数)
  • 样例输入:
    5
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5
  • 样例输出:30

具体代码:

n=int(input())
arr=[]
for i in range(n):
    arr.append(list(map(int,input().split())))
# print(arr)
time=0
for i in range(n-1,-1,-1):
    for j in range(i):
        # print(arr[i][j],'******',arr[i][j+1])
        arr[i-1][j]+=max(arr[i][j],arr[i][j+1])
        time+=1
        # print('第{}次循环'.format(time),arr)
print(arr[0][0])

运行结果:
在这里插入图片描述

35:单词翻转

  • 问题描述:输入包括一个英语句子。
  • 输入格式:按单词的顺序把单词倒序输出
  • 输出格式:最大总和(整数)
  • 样例输入:I love you
  • 样例输出:you love I

具体代码:

n=list(map(str,input().split(' ')))
num=len(n)
for i in range(1,num+1):
    print(n[num-i],end=' ')

运行结果:
在这里插入图片描述

36:进制转换

  • 问题描述:编写函数将十进制整数按8进制输出,然后编写main函数验证该函数。例如输入12,则输出为:12=014,输入32,则输出32=040。
  • 输入格式:输入一个整数。
  • 输出格式:输出这个整数的八进制形式。
  • 样例输入:12
  • 样例输出:014

具体代码:

n=int(input())
if n==0:
    print(0)
else:
    n1=len(str(n))
    print(n1)
    if n1==3:
        print("{0:0>4}".format(format(n,'o')))
    else:
        print("{0:0>3}".format(format(n,'o')))

运行结果:
在这里插入图片描述

37:成绩排名

  • 问题描述:小明刚经过了一次数学考试,老师由于忙碌忘记排名了,于是老师把这个光荣的任务交给了小明,小明则找到了聪明的你,希望你能帮他解决这个问题。
  • 输入格式:第一行包含一个正整数N,表示有个人参加了考试。接下来N行,每行有一个字符串和一个正整数,分别表示人名和对应的成绩,用一个空格分隔。
  • 输出格式:输出一共有N行,每行一个字符串,第i行的字符串表示成绩从高到低排在第i位的人的名字,若分数一样则按人名的字典序顺序从小到大。
  • 样例输入:
    3
    aaa 47
    bbb 90
    ccc 70
  • 样例输出:
    bbb
    ccc
    aaa

具体代码:

n=int(input())
list=[]
for i in range(n):
    a,b=input().split()
    list.append([a,int(b)])
list.sort(key=lambda x:x[0])
list.sort(key=lambda x:x[1],reverse=True)
print(list)
for i in list:
    for j in range(1):
        print(i[j])

运行结果:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZY_dl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值