python刷题第三周

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了python刷题第三周脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

以下是本周有所收获的题目

第一题:

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

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

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

我的代码:

n = int(input())
for i in range(2, n):
    flag = 0
    for x in range(2, i // 2):
        if i % x == 0:
            flag = 1
            break
    if flag == 0:
        for x in range(i, n):
            if i + x == n:
                flag = 0
                for y in range(2, x // 2):
                    if x % y == 0:
                        flag = 1
                        break
                if flag == 0:
                    PRint("%d = %d + %d" % (n, i, x))
                    exIT()

由于算法不够好,有两个测试点显示运行超时。

别人的代码:

#本题难点在于避免数字较大时超时
import math
n = int(input())
for p in range(2,n):
    for i in range(2,int(math.sqrt(p))+1):
        if p%i == 0:
            break
    else:
        q = n-p
        for k in range(2,int(math.sqrt(q))+1):
            if q%k == 0:
                break
        else:
            print("{} = {} + {}".format(n,p,q))
            break

思考:

1.我想对循环的中的变量开根号,但却一直无法实现,直到我看到别人的代码之后才发现原来开完根号之后要转换为int类型!

int(math.sqrt(p))

2 在找到第一个素数之后另一个素数可以直接用n-x得到,然后再判断是不是素数。而我的代码中却还要再用一个循环找,效率太低。

3 对于判断素数,还有一个地方值得我学习

for k in range(2,int(math.sqrt(q))+1):
            if q%k == 0:
                break
else:
   print("{} = {} + {}".format(n,p,q))

这里的if else的用法非常好,注意else的位置,在for的下面。如果没有一个if符合,则执行else。以后我也应该这样做。

第二题:

第4章-6 输出前 n 个Fibonacci数 (15 分) 本题要求编写程序,输出菲波那契(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.

我的代码:

N = int(input())
ls = [1 for x in range(N)]
count = 0
if N < 1:
    print("Invalid.")
    exit()
for i in range(0, N):
    if i == 0 or i == 1:
        print("{:=11}".format(ls[i]), end="")
        count += 1
        continue
    ls[i] = (ls[i - 2] + ls[i - 1])
    print("{:=11}".format(ls[i]), end="")
    count += 1
    if count == 5 or i == N - 1:
        print()
        count = 0

我学到了:

1.格式化输出: 题目要求输出的每个数占11位,在C中可以通过setw函数实现,而在Python中可以通过可以直接在print中实现:

print("{:=11}".format(ls[i]), end="")

以下是format的相关知识:

格式限定符: 语法是{}中所带:号即为格式限定符,如:

填充与对齐 填充常跟对齐一起使用 ^、<、>分别是居中、左对齐、右对齐,后面带宽度 :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充 例如:’{:<8.3}’.format(0.12345) 输出为 0.123 ,共占八个字符位置,可以用来进行输出对齐;

In [15]: '{:>8}'.format('189') Out[15]: ' 189' In [16]: '{:0>8}'.format('189') Out[16]: '00000189' In [17]: '{:a>8}'.format('189') Out[17]: 'aaaaa189' ———————————————— 版权声明:本文为CSDN博主「christianashannon」的原创文章,遵循CC 4.0 BY-sA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/christianashannon/article/details/78964961

2.初始化列表: 我在一开始写的时候,因为列表的长度过短,比较麻烦,后来初始化长度之后就可以了, 之前一直不知道怎么初始化列表。

ls = [1 for x in range(N)] ## 1处填初始化的值

第三题:

第4章-12 求满足条件的斐波那契数 (30 分) 斐波那契数,亦称之为斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……,这个数列从第3项开始,每一项都等于前两项之和。求大于输入数的最小斐波那契数。

输入格式: 在一行输人一个正整数n(n>=10)。

输出格式: 在一行输出大于n的最小斐波那契数。

我的代码:

ls = [1 for x in range(1000)]
i = 2
n = int(input())
while 1:
    print(ls[i])
    if ls[i] > n:
        print(ls[i])
        break
    else:
        ls[i] = ls[i - 2] + ls[i - 1]
        i += 1

我想建立一个长度为1000的列表,再将列表的数与n比较,得出符合的斐波那契数。 但是我发现当我通过ls = [1 for x in range(1000)]将ls初始化之后,列表的值无法改变,暂时没有找到解决的办法。

别人的代码:

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

思考:

看了别人的代码才知道可以写的这么简单,压根就不用使用列表,只需要一个循环就可以解决了!可以学习的地方还有很多啊

以后我会多尝试少使用列表,多用迭代的方式解决问题吧。

第四题:

第4章-13 求误差小于输入值的e的近似值 (20 分) 自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。ei代表前i项求和。输入误差范围error,当 ei+1-ei<error,则表示e的近似值满足误差范围。

输入格式: 在一行输入误差范围。

输出格式: 在一行输出e的近似值(保留6位小数)。

我的代码:

s1 = -2.000000
s2 = 0.000000
num = 0
y = 1
n = float(input())
while s2 - s1 >= n:
    j = 1
    for x in range(1, y + 1):
        j *= x
    s1 = s2
    s2 += 1 / j
    y += 1
s2 += 1
print("%0.6f" % s2)

别人的代码:

error=float(input())
a,b,n=1,2,2
while b-a>=error:
    a,b=b,b+(b-a)/n
    n=n+1
print("%.6f"%b)

思考:

毫无疑问,别人的代码比我的简洁太多太多了! 他把计算过程抽象成了一个简单的公式a,b=b,b+(b-a)/n 而不需要像我那样一个个求和,实在太厉害,他的数学一定很好。

第五题:

第4章-14 统计字符 (15 分) 本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。

输入格式: 输入为10个字符。最后一个回车表示输入结束,不算在内。

输出格式: 在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数 的格式输出。

参考了别人的代码:

letter,blank,digit,other=0,0,0,0
s=input()
while 1:
    for i in s:
        if i.isalpha():
            letter=letter+1
        elif "0"<=i<="9":
            digit=digit+1
        elif i==" " or i=="n":
            blank=blank+1
        else:
            other=other+1
    if letter+digit+blank+other>=10:
        break
    blank=blank+1
    s=input()
print("letter = %d, blank = %d, digit = %d, other = %d"%(letter,blank,digit,other))

思考:

1.我一直在找python有没有一种输入函数可以把回车也读取进去,但是却找不到,因此也就不知道该怎么写。当我看到别人的代码之后发现其实根本就不必要一次性把全部字符都读进去,这是问题的关键。 2.当没有回车时,正常循环统计个数,当遇到回车后,只需要继续进行input()输入就行了,这里就需要在外层再设置一个循环,当输入的字符个数达到10个自动跳出循环,这是很关键的一个地方。

脚本宝典总结

以上是脚本宝典为你收集整理的python刷题第三周全部内容,希望文章能够帮你解决python刷题第三周所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。