【python】py课后作业程序题3「PTA」

7-1 生成3的乘方表

输入一个非负整数n,生成一张3的乘方表,输出
在这里插入图片描述

的值。可调用幂函数计算3的乘方。

输入格式:
输入在一行中给出一个非负整数n。

输出格式:
按照幂的递增顺序输出n+1行,每行格式为“pow(3,i) = 3的i次幂的值”。题目保证输出数据不超过长整型整数的范围。

输入样例:
3
输出样例:
pow(3,0) = 1
pow(3,1) = 3
pow(3,2) = 9
pow(3,3) = 27

思路:
因为求的是幂,我们可以使用math库中的pow方法math.pow(3,i)来非常迅速的解决
注意:需要import math,要不然找不到对应的方法的

代码区:

import math
n = int(input())
for i in range(n + 1):
    print("pow(3,{:d}) = {:d}".format(i, int(math.pow(3,i))))

7-2 统计素数并求和

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

输入格式:
输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:
在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:
10 31
输出样例:
7 143

思路:
需要对是否是素数进行判断,所以我们先写一个专门用来判断是否是素数的方法isPrime.很显然,1不是素数,2是素数,素数的满足条件是什么就不用我多说了吧,我们对从3开始的数到n开始进行判断,如果能n能被整除就不是素数,如果到n为之都没有返回不是素数,那么他就是素数.返回true
然后我们写主函数,从最小的开始for循环,直到最大数为之,一旦发现素数就累加器加一然后累加到sum中

代码区:

def isPrime(n):
    if n == 1:
        return False
    if n == 2:
        return True
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

min, max = [int(num) for num in input().split()]
cnt = 0
sum = 0
for num in range(min, max + 1):
    if isPrime(num):
        cnt += 1
        sum += num
print(cnt, sum)

7-3 猴子吃桃问题

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

输入格式:
输入在一行中给出正整数N(1<N≤10)。

输出格式:
在一行中输出第一天共摘了多少个桃子。

输入样例:
3
输出样例:
10

思路:
对于这种问题不可以正着来思考会很烦,我们倒着想,最后一天只有一个,加上上一天多吃的一个就是两个,然后再加上一半也就是等于4个,这样就推断出倒数第二天一开始有的桃子数,以此类推就可以得到第一天的桃子数了.

代码区:

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

7-4 验证“哥德巴赫猜想”

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:
输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:
在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:
24
输出样例:
24 = 5 + 19

思路:
也是一道需要对素数进行判断的,所以我们直接复制上面写好的isPrime方法来继续用.不过因为这个题目数据比较大,所以进行了优化,对循环范围进行了缩小,因为不可能整除一个比自己的根号2倍大的数还可以等于0.
对素数判断的方法写好了就简单了,只需要进行从2到n的循环,发现一个素数就把n-该素数也进行素数的判断,如果也是素数就是符合条件的数了.

代码区:

import math
def isPrime(n):
    if n == 1:
        return False
    if n == 2:
        return True
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True


n = int(input())
rest = 0
for i in range(2, n):
    if isPrime(i):
        rest = n - i
        if isPrime(rest):
            print("{:d} = {:d} + {:d}".format(n, i, rest))
            break

7-5 求e的近似值

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

输入格式:
输入第一行中给出非负整数 n(≤1000)。

输出格式:
在一行中输出部分和的值,保留小数点后八位。

输入样例:
10
输出样例:
2.71828180

思路:
很显然可以看出分母是一个阶乘,所以我们先定义一个求阶乘的方法(忽略我这里的方法名qwq),只需要用for循环进行累乘就可以了
然后按照式子的格式就可以得出结果了,注意格式问题,保留8位小数

代码区:

def mi(n):
    num = 1
    for i in range(1, n + 1):
        num *= i
    return num

m = int(input())
res = 1
for i in range(1, m + 1):
    res += 1/mi(i)
print("{:.8f}".format(res))
        

7-6 输出前 n 个Fibonacci数

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

输入格式:
输入在一行中给出一个整数N(1≤N≤46)。

输出格式:
输出前N个Fibonacci数,每个数占11位,每行输出5个。如果最后一行输出的个数不到5个,也需要换行。

如果N小于1,则输出"Invalid."

输入样例1:
7
输出样例1:
1 1 2 3 5
8 13
输入样例2:
0
输出样例2:
Invalid.

思路:
首先排除一些情况,当输入小于1的时候就输出Invalid.
因为求的是斐波那契数列,所以第一个和第二个数字都是1,我们先把这两个给定义好,然后用动态规划的思想,每次都使新的n1等于原来的n2,然后再使n2变成新n1+原来的n2.这样就实现了每个数都是前两个数之和.
然后格式问题需要注意,print后面要有一个end =''要不然会换行,同时没输出一个数就使累加器加一,等到5时就换行
还有就是如果结束前的一个数之后也要进行换行.

代码区:

n = int(input())
n1 = 1
n2 = 1
c = 0
if n < 1:
    print("Invalid.")
else:
    for i in range(n):
        if i == 0:
            print("{:11d}".format(n1), end = '')
            c += 1
        elif i == 1:
            print("{:11d}".format(n2), end = '')
            c += 1
        else:
            print("{:11d}".format(n1 + n2), end = '')
            n1, n2 = n2, n1 + n2
            c += 1
            if c % 5 == 0:
                print()
            elif i == n - 1:
                print()

7-7 统计学生平均成绩与及格人数

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

输入格式:
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:
按照以下格式输出:

average = 成绩均值
count = 及格人数
其中平均值精确到小数点后一位。

输入样例:
5
77 54 92 73 60
输出样例:
average = 71.2
count = 4

思路:

首先因为需要求平均数,所以先求和,我这是先都放到列表中然后使用自带的sum函数求和,然后除以数量就是平均数了
然后按照格式输出我们需要的就可以了

代码区:

n = int(input())
if n == 0:
    print("average = 0.0")
    print("count = 0")
else:
    scores = [int(score) for score in input().split()]
    average = sum(scores) / n
    c = 0
    for score in scores:
        if score >= 60:
            c += 1
    print("average = {:.1f}".format(average))
    print("count = {:d}".format(c))

7-8 求分数序列前N项和

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

输入格式:
输入在一行中给出一个正整数N。

输出格式:
在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:
20
输出样例:
32.66
思路:
总结规则,可以发现这个式子是一开始分子为2,分母为1,然后每一次都是新分子为上一个的分子分母相加,然后新分母等于上一个的分子
所以我们对于初始化的2/1累加之后就先得到新的分子分母然后再通过for循环来完成累加

代码区:

n = int(input())
fenzi = 2
fenmu = 1
sum = 0
for i in range(n):
    sum += fenzi / fenmu
    fenzi2 = fenzi + fenmu
    fenmu2 = fenzi
    fenzi = fenzi2
    fenmu = fenmu2
print("{:.2f}".format(sum))

7-9 查询水果价格

给定四种水果,分别是苹果(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。

输入格式:
输入在一行中给出用户连续输入的若干个编号。

输出格式:
首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

输入样例1:
3 -1 0 2
输出样例1:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 4.10
price = 0.00
输入样例2:
1 2 3 3 4 4 5 6 7 8
输出样例2:
[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 3.00
price = 2.50
price = 4.10
price = 4.10
price = 10.20

思路:
一看这题,果断使用赖皮方法嘿嘿,还好数据量不大,所以直接按照输入的进行判断然后直接输出就可以了,不过还需要对于次数进行判断,一旦等于5次就退出
还有需要注意是输入为0也要输出price不过价格为0.00

代码区:

print("[1] apple")
print("[2] pear")
print("[3] orange")
print("[4] grape")
print("[0] exit")
n = 0
choose = input().split()
for c in choose:
    if c == '1':
        print("price = 3.00")
        n += 1
        if n == 5:
            break
    elif c == '2':
        print("price = 2.50")
        n += 1
        if n == 5:
            break
    elif c == '3':
        print("price = 4.10")
        n += 1
        if n == 5:
            break
    elif c == '4':
        print("price = 10.20")
        n += 1
        if n == 5:
            break
    elif c == '0':
            break
    else:
        print("price = 0.00")
        n += 1
        if n == 5:
            break

7-10 最大公约数和最小公倍数

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

输入格式:
输入在一行中给出两个正整数M和N(≤1000)。

输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:
511 292
输出样例:
73 2044

思路:
最大公约数我们可以从两数中比较小的开始递减来求,给range里面加一个-1就是表示递减,只要满足能被两个数都整除的就是最大公约数(因为是从大往小循环的,所以只要一找到就是最大的了)找到之后退出循环
最小公倍数需要从两数中大的开始找,一旦这个数可以把我们的两个数都整除那么他就是公倍数,由于是从两数中最大的开始找的,所以肯定是最小的公倍数,找到就退出循环
输出需要注意的是不要换行,第一个输出之后加一个空格

代码区:

n, m = input().split()
n = int(n)
m = int(m)
if n > m:
    n, m = m, n
for i in range(n, 0, -1):
    if n % i == 0 and m % i == 0:
        print(i, end = ' ')
        break
c = m
while True:
    if c % n == 0 and c % m == 0:
        print(c, end = '')
        break
    c += 1


新手上路,有错请指正;

猜你喜欢

转载自blog.csdn.net/qq_33884853/article/details/124586331