PTA 第四章算法题汇总

嗨,同学,要成为粉丝才可见奥,关注我把哈哈哈哈或,奥利给 ~

7-1 生成3的乘方表 (15分)

输入一个非负整数n,生成一张3的乘方表,输出3​0​​~3​n​​的值。可调用幂函数计算3的乘方。

n=int(input())
for i in range(0,n+1):
    print("pow(3,%d) = %d"%(i,3**i))

7-2 统计素数并求和 (20分)

本题要求统计给定整数M和N区间内素数的个数并对它们求和。

'''
sum=0
count=0
m,n=map(int,input().split())
if m==1:
   m+=1
for i in range(m,n+1):
    for k in range(2,i):
        if i%k==0:
            break
    else:
      sum=sum+i
      count+=1
print("{:d} {:d}".format(count,sum))
'''
'''
m, n = map(int, input().split())


def f(x):
    if x > 1:
        flag = True
        for j in range(2, x):
            if x % j == 0:
                flag = False
                break
    else:
        flag = False
    return flag


a = [i for i in range(m, n + 1) if f(i) == True]
print(len(a), sum(a))
'''
m,n=map(int,input().split())
a=0
s=0
if m==1:
    m=2
for i in range(m,n+1):
    b=True
    for j in range (2,i):
        if i%j==0:
            b=False
            break
    if b==True:
        a+=1
        s+=i
print(a, s)

7-3 猴子吃桃问题 (15分)

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

days = int(input())
t = 1
for i in range(days-1):
    t = (t+1)*2
print(t)

7-4 求e的近似值 (15分)

自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

n = int(input())
s = 1
for i in range(1,n+1):
    f = 1
    for j in range(1,i+1):
        f = f*j
    s += 1/f
print("{:.8f}".format(s))

7-5 输出前 n 个Fibonacci数 (15分)

本题要求编写程序,输出菲波那契(Fibonacci)数列的前N项,每行输出5个,题目保证输出结果在长整型范围内。Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,例如:1,1,2,3,5,8,13,...。


n=int(input())
if n==0:
    print("Invalid.")
else:
    a=1
    b=1
    for i in range(0,n):
        print("{:>11d}".format(a),end="")
        a,b=b,a+b
        if i%5==4:
            print()
'''
n=int(input())
a=1
b=1
c=0
e=1
if n>=1:
    for i in range(n):
        if i<2:
           e=1
        else:
           e=a+b
           a=b
           b=e
        print('{:>11d}'.format(e),end='')
        c+=1
        if c==5:
           print('')
           c=0
else:
    print('Invalid.')
'''

7-6 统计学生平均成绩与及格人数 (15分)

本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。

'''
n=int(input())
if n==0:
    print('average = 0.0')
    print('count = 0')
else:
    list=input().split()
    sum=0
    count=0
    for i in range(n):
        f=int(list[i])
        sum+=f
        if f>=60:
            count+=1
    print("average = {:.1f}".format(sum/n))
    print("count = {:d}".format(count))
'''
n=int(input())
s=0
c=0
if n==0:
    print('average = 0.0')
    print('count = 0')
else:
    a=list(input().split())
    for i in range(len(a)):
        s=s+int(a[i])
        if int(a[i])>=60:
            c=c+1
    print("average = {:.1f}".format(s/n))
    print("count = {}".format(c))

7-7 求分数序列前N项和 (15分)

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

n = int(input())
a = 1
b = 1
s = 0
for i in range(1, n + 1):
    a, b = b, a + b
    s = s + float(b / a)
print("{:.2f}".format(s))

7-8 查询水果价格 (15分)

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit

用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

'''
print("[1] apple")
print("[2] pear")
print("[3] orange")
print("[4] grape")
print("[0] exit")
s=list(map(int,input().split()))
for i in range(0,len(s)):
    if i>=5:
        break
    a=s[i]
    if a==1:
        print("price = 3.00")
    elif a==2:
        print("price = 2.50")
    elif a==3:
        print("price = 4.10")
    elif a==4:
        print("price = 10.20")
    elif a==0:
        break
    else:
        print("price = 0.00")
'''
n=list(map(int,input().split()))
c=0
print("[1] apple")
print("[2] pear")
print("[3] orange")
print("[4] grape")
print("[0] exit")
for i in n:
    if c>4:
        break
    elif i==1:
        print("price = 3.00")
        c=c+1
    elif i==2:
        print("price = 2.50")
        c=c+1
    elif i==3:
        print("price = 4.10")
        c=c+1
    elif i==4:
        print("price = 10.20")
        c=c+1
    elif i==0:
        print("price = 0.00")
        break   

7-9 最大公约数和最小公倍数 (15分)

本题要求两个给定正整数的最大公约数和最小公倍数。

def f(m,n):
    if m%n==0:
        return n
    else:
        return f(n,m%n)
m,n=map(int,input().split())
if m

7-10 判断素数 (20分)

判断一个给定的正整数是否素数

n = int(input())
prime = []
for i in range(1, n + 1):
    prime.append(input())
for num in prime:
    flag = True
    for i in range(2,int(num)):
        if int(num)%i==0:
            flag = False
            break
    if flag:
        print("Yes")
    else:
        print("No")

7-11 求满足条件的斐波那契数 (30分)

斐波那契数,亦称之为斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……,这个数列从第3项开始,每一项都等于前两项之和。求大于输入数的最小斐波那契数。7-12 字符串字母大小写转换 (15分)

n=int(input())
a=1
b=1
while a<=n:
    a,b=b,a+b
print(a)

7-12 求误差小于输入值的e的近似值 (20分)

自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。ei代表前i项求和。输入误差范围error,当
ei+1-ei

error=float(input())
a=1
i=2
t=2
b=1/t
sum=2
e1=1
e2=sum
while e2-e1>=error:
   e1=e2
   a=b
   sum+=a
   e2=sum
   i+=1   #阶乘计数
   t*=i   #阶乘值
   b=1/t
print("{:.6f}".format(sum))

7-13 换硬币 (20分)

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

'''
a=int(input())
count=0
for i in range(a,0,-1):      
    for j in range(a,0,-1):   
        for k in range(1,a):
            if i*5+j*2+k==a:  #判断条件
                print("fen5:{}, fen2:{}, fen1:{}, total:{}".format(i,j,k,i+j+k))
                count+=1
print("count = %d"%count)
'''
'''
import math
a=int(input())
count=0
for i in range(int(a/5),0,-1):      
    for j in range(math.ceil(0.5*(a-5*i)) - 1,0,-1):
    #for j in range(int(0.5*(a-5*i)),0,-1):    
       # if a - 5*i - 2*j:  # k = a - 5*i - 2*j, 一分的数量不为0
        print("fen5:{}, fen2:{}, fen1:{}, total:{}".format(i, j, a - 5*i - 2*j, a - 4*i - j))
        count+=1
print("count = %d"%count)
'''

import math
a=int(input())
count=0
for i in range(int(a/5),0,-1):      
    for j in range(math.ceil(0.5*(a-5*i)) - 1,0,-1): # ceil  向上取整
        print("fen5:{}, fen2:{}, fen1:{}, total:{}".format(i, j, a - 5*i - 2*j, a - 4*i - j))
        count+=1
print("count = %d"%count)

7-14 jmu-python-判断是否构成三角形 (10分)

输入三角形的三边,判断是否能构成三角形。若能构成输出yes,否则输出no。

a,b,c=input().split()
a,b,c=eval(a),eval(b),eval(c)
if a+b>c and a+c>b and b+c>a:
    print("yes")
else:
    print("no")

7-15 水仙花数(20 分) (20分)

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。

本题要求编写程序,计算所有N位水仙花数。

import math
n=int(input())
for i in range(int(math.pow(10,n-1)),int(math.pow(10,n))):
    sum=0
    j=i
    while(j>=1):
        sum=sum+math.pow(j%10,n)
        j=j//10
    if(sum==i):
        print('{:d}'.format(i))

7-16 求1!+3!+5!+……+n! (10分)

求1!+3!+5!+……+n!的和,要求用循环嵌套设计,n<12。

def func(n):
    return 1 if n == 1 else n * func(n-1)

n = int(input())
s = 0
for i in range(1, n +1, 2):
    s = s + func(i)
print("n=%d,s=%d"%(n,s))

7-17 找出不是两个数组共有的元素 (20分)

给定两个整型数组,本题要求找出不是两者共有的元素。

arr1 = list(map(int, input().split()))
arr2 = list(map(int, input().split()))
ans = []
for i in arr1[1:]:
    if i not in arr2[1:] and i not in ans:
        ans.append(i)
for i in arr2[1:]:
    if i not in arr1[1:] and i not in ans:
        ans.append(i)
for i in ans[:-1]:
    print(i, end=' ')
print(ans[-1])

7-18 找完数 (20分)

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

'''
from math import sqrt
m,n=map(int,input().split())
flag=False
for i in range(m,n+1):
    l1=[1]
    for j in range(2,int(sqrt(i))+1):      
        if i%j==0:
            l1.append(j)
            l1.append(i//j)    #把剩下的因数放进去
    l1=sorted(l1)  #排序
    num=sum(l1)
    if num==i:
        flag=True
        print("{:d} = ".format(num),end='')
        for i in range(len(l1)):
            if i!=len(l1)-1:
                print("{:d} + ".format(l1[i]),end='')
            else:
                print("{:d}".format(l1[i]))
if flag ==False:
    print("None")
'''
'''
import math
m,n=map(int,input().split())
flag = True
for i in range(m,n+1):
    s=list()
    for j in range(2,int(math.sqrt(i))+1):  #sqrt防止运行超时
        if i%j==0:
            s.append(j)
            s.append(i//j)
    if sum(s)+1==i:
        s.sort()
        flag = False
        print("%d = 1"%i,end="")
        for k in s:
            print(" + %d"%k,end="")
        print()
if flag:
    print("None")
'''

'''
import math 
s,q=map(int,input().split())
a=0
for m in range(s,q+1):
    b=list()
    for i in range(2, int(math.sqrt(m)) + 1):   # 此处容易运行超时
        if m%i==0:
            b.append(int(i))
            b.append(int(m//i))
    b.sort()
    if m==sum(b) + 1:
        print("%d = 1"%m,end="")
        for k in b:
            print(" + %d"%k,end="")
        print()
        a=a+1
if a==0:
    print("None")
'''

m,n=map(int,input().split())
flag=0
for i in range(m,n+1):
    s =[]
    for j in (1,i):
        if i%j==0
        s.append(j)
    if sum(s)==i
    print('{} = {}'.format(i," + ".join(j for j in s)))
    flag=1
if flag==0:
    print("None")

7-19 猴子选大王 (20分)

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

n=int(input())
s1=list(range(1,n+1))
s2=list()
count=0
while len(s1)-len(s2)>=2:
    for i in s1:
        if i not in s2:
            count=count+1
            if count==3:
                s2.append(i)
                count=0
print(sum(s1)-sum(s2))

7-20 矩阵运算 (20分)

给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

n = int(input())
matrix = []
S = 0
for i in range(0, n):
    temp = list(input().split())
    matrix.append(temp)
for i in range(0, n-1):
    for j in range(0, n-1):
        if not i + j == n - 1:
            S += int(matrix[i][j])
print(S)

7-21 求矩阵各行元素之和 (15分)

本题要求编写程序,求一个给定的m×n矩阵各行元素之和。

m,n=map(int,input().split())
for i in range(m):
    print(sum(list(map(int,input().split()))))

  

7-22 判断上三角矩阵 (15分)

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。

本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

n=int(input())
flag=[]
for i in range(0, n):
    m=int(input())
    a=[]
    count = 1
    for j in range(0, m):
        s=input()
        a.append([int(x) for x in s.split()])
    for k in range(0,m):
        for l in range(0,k):
            if a[k][l]:
                count = 0
    if count:
        flag.append(1)
    else:
        flag.append(0)
for z in flag:
    if z:
        print("YES")
    else:
        print("NO")

7-23 找鞍点 (20分)

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

'''
a = int(input())
s =[]
flag = 1
for i in range(a):
    m = list(map(int,input().split()))
    s.append(m)
for r in range(a):
    c = s[r].index(max(s[r]))
    k = 0
    while k < len(s):
        if s[r][c] <= s[k][c]:
            k = k+1
            if k == len(s):
                print(r,c)
        else:
            flag = 0
            break
    if flag == 0:
        print("NONE")
        break
'''

# 找鞍点: 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小

def max_index(lst_int):
    index = []
    max_n = max(lst_int)
    for i in range(len(lst_int)):
        if lst_int[i] == max_n:
            index.append(i)
    return index  #返回一个列表

n = int(input()); a = []; flag = False
for i in range(n):
    a.append(list(map(int,input().split())))
for row in range(n): 
    column_idx = max_index(a[row])   # find column-index of maximal number of row-th row
    col_val = []
    for col in column_idx:
        col_val = [i[col] for i in a]  # get value of col-th column
        if a[row][col] == min(col_val):   # if row-max is equal to column-min
            print(row, col)
            flag = True
            break
if not flag:
    print("NONE")
'''
n=int(input());a=[];count=0;count1=0
for i in range(n):
    s=input()
    a.append([int(n) for n in s.split()])
for j in range(n):
    if count1 == n and count == n:
        break
    for k in range(n):
        for k1 in range(n):
            if a[j][k]>=a[j][k1]:
                count+=1
        if count==n:
            for j1 in range(n):
                if a[j][k]<=a[j1][k]:
                    count1+=1
            if count1==n:
                print("{} {}".format(j,k))
                break
        count1=0;count=0
if count1!=n and count!=n:
    print("NONE")
'''

7-24 打印九九口诀表 (15分)

下面是一个完整的下三角九九口诀表:

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  

本题要求对任意给定的一位正整数N,输出从1*1N*N的部分口诀表。

gw = int(input())
for gu in range(1, gw + 1):
    for t in range(1, gu):
        print("{:d}*{:d}={:<4d}".format(t, gu, t * gu), end='')
    print("{:d}*{:d}={:<4d}".format(gu, gu, gu * gu), end="\n")

7-25 求矩阵的局部极大值 (15分)

给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。


m,n = map(int,input().split())
a = []
flag = True
for i in range(0,m):
    a.append(list(map(int,input().split())))
for j in range(1,m-1):
    for k in range(1,n-1):
        if a[j][k] > a[j-1][k] and a[j][k] > a[j+1][k] and a[j][k] > a[j][k-1] and a[j][k] > a[j][k+1]:
            print(a[j][k],j+1,k+1)
            flag = False
if flag:
    print("None",m,n)

7-26 输出三角形字符阵列 (15分)

本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。

n = int(input())
for i in range(0, n):
    for j in range(0, n - i):
        print('{:c} '.format(65 + int(0.5*(n + n - i + 1)*i + j)),end="")
    print("")
# int(0.5*(n + n - i + 1)* i) = n + n-1 + n-2 + ... + n-i+1  

7-27 二维数组中每行最大值和每行和 (10分)

求一个3*3二维数组中每行的最大值和每行的和。


n=list(map(int,input().split()))
for i in range(0,3):
    li=n[3*i:3+3*i]
    s=sum(li)
    li.append(max(li))
    li.append(s)
    for b in li:
        print('%4d'%b,end='')    
    print('')
'''
n=list(map(int,input().split()))
li=[n[:3],n[3:6],n[6:]]
for i in li:
    s=sum(i)
    i.append(max(i))
    i.append(s)
    cnt=0
    for j in i:
        print('%4d'%j,end='')
        cnt+=1
        if cnt==len(i):
            print('')
'''

7-28 矩阵转置 (10分)

将一个3×3矩阵转置(即行和列互换)。

num = list(map(int, input().split()))
for i in range(0, 3):
    for j in range(0, 3):
        print("{:>4d}".format(num[i + 3*(j)]),end="")
    print("")

7-29 找出总分最高的学生 (15分)

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

n = int(input())
s = 0
b = ['', '', '', '', '']
m = 0
q = 0
for i in range(n):
    k = input().split()
    s = 0
    for j in range(2, 5):
        s = s + int(k[j])
    if s > m:
        m = s
        b = k
print(b[1], b[0], m)

 

你可能感兴趣的:(PTA 第四章算法题汇总)