python入门学习随记(七)

本文记录了Python初学者在学习过程中的7个算法实践,包括奇数倒数序列求和、平方与倒数序列部分和、交错序列求和等,涉及数值计算、温度转换、素数判断等基础编程问题。

7-1 求奇数分之一序列前N项和

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + … 的前N项之和。

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

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

输入样例:

23

输出样例:

sum = 2.549541

n = int(input())

lst = [1/(2*x-1) for x in range(1,n+1)]

print("sum = {0:.6f}".format(sum(lst)))

7-2 求平方与倒数序列的部分和

本题要求对两个正整数m和n(m≤n)编写程序,计算序列和
在这里插入图片描述
输入格式:
输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。

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

输入样例:

5 10

输出样例:

sum = 355.845635

m,n = input().split()
m = int(m)
n = int(n)
lst = [x*x+1/x for x in range(m,n+1)]

print("sum = {0:.6f}".format(sum(lst)))

7-3 求交错序列前N项和

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和。

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

输出格式:
在一行中输出部分和的值,结果保留三位小数。

输入样例:

5

输出样例:

0.917

m = int(input())
lst = [x/(2*x-1)*(-1)**(x+1) for x in range(1,m+1)]
print("{0:.3f}".format(sum(lst)))

7-4 输出华氏-摄氏温度转换表

输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper]、且每次增加2华氏度的华氏-摄氏温度转换表。

温度转换的计算公式:C=5×(F−32)/9,其中:C表示摄氏温度,F表示华氏温度。

输入格式:
在一行中输入2个整数,分别表示lower和upper的值,中间用空格分开。

输出格式:
第一行输出:“fahr celsius”

接着每行输出一个华氏温度fahr(整型)与一个摄氏温度celsius(占据6个字符宽度,靠右对齐,保留1位小数)。

若输入的范围不合法,则输出"Invalid."。

输入样例1:

32 35

输出样例1:
fahr celsius

32 0.0
34 1.1

输入样例2:

40 30

输出样例2:

Invalid.

m,n = input().split()
m = int(m)
n = int(n)

if m > n:
    
    print('Invalid.')
else:
    print('fahr celsius')
    for i in range(m,n+1,2):
        print('{0}{1:>6.1f}'.format(i,5*(i-32)/9))

7-5 判断素数

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

输入格式:
输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于1000000 的需要判断的正整数

输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No

输入样例:
在这里给出一组输入。例如:

2
11
111

输出样例:
在这里给出相应的输出。例如:

Yes
No

n = int(input())
a = []
for i in range(n):
    y = int(input())
    a.append(y)
for m in range(0,n):
    x = a[m]

    for i in range(2,x):
        if (x % i == 0) :
            print("No")
            break
    else:
        print("Yes")

7-6 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。

输入格式:
输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

输出格式:
首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。

输入样例:

-3 8

输出样例:

  -3   -2   -1    0    1
   2    3    4    5    6
   7    8 

Sum = 30

a,b = input().split()
a = int(a)
b = int(b)
n = 0
m = 1
c=a if a>b else b
d=b if a>b else a
for x in range(d,c+1):
    print('%5d' % x ,end= '\n' if m%5==0 or x == c else '')
    n = n+x
    m = m+1
print('Sum = {0}'.format(n))

7-7 换硬币

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

输入格式:
输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:
要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:

13

输出样例:

fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

x = int(input())
count = 0
for a in range(x//5,0,-1):
    for b in range(x-a*5,0,-1):
        for c in range(x-a*5-b*2+1,0,-1):
            if 5*a + 2*b + c == x:
                count += 1
                print('fen5:{0}, fen2:{1}, fen1:{2}, total:{3}'.format(a,b,c,a+b+c))
print('count = {}'.format(count))
                

7-8 求矩阵的局部极大值

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

输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:

4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1

输出样例1:

9 2 3
5 3 2
5 3 4

输入样例2:

3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1

输出样例2:

None 3 5

a,b = input().split()
a = int(a)
b = int(b)
lst = []
c = 0
for i in range(a):
    y =list(input().split())
    lst.append(y)
for m in range(1,a-1):
    for n in range(1,b-1):
        if int(lst[m][n]) > int(lst[m][n-1]) \
           and int(lst[m][n]) > int(lst[m][n+1]) \
           and int(lst[m][n]) > int(lst[m-1][n]) \
           and int(lst[m][n]) > int(lst[m+1][n]):
            print('{0} {1} {2}'.format(lst[m][n],m+1,n+1))
            c += 1
if c == 0:
    print('None {0} {1}'.format(a,b))

7-9 矩阵对角线求和(二维数组)

把数据输入到一个n×n的方阵中,输出该矩阵,并求它两条对角线上元素之和。

注意:如果主对角线和次对角线有相交元素,求和时相交元素只加一次。

输入格式:
先输入行数n(n不超过10)

再输入n×n个整数。

输出格式:
先以矩阵形式输出该方阵,每个数占3格

再输出sum = 和值。

输入样例1:

5
1 1 1 1 1
1 2 3 4 5
0 1 2 3 4
2 2 2 2 2
1 1 1 1 1

输出样例1:

1  1  1  1  1
1  2  3  4  5
0  1  2  3  4   
2  2  2  2  2   
1  1  1  1  1 

sum = 16

输入样例2:

4
1 2 3 4
5 6 7 8
1 1 1 1
6 6 6 6

输出样例2:

 1  2  3  4   
 5  6  7  8   
 1  1  1  1   
 6  6  6  6 

sum = 32

a = input()
a = int(a)
lst = []
b = 0
c = 0
for i in range(a):
    y =list(input().split())
    lst.append(y)
for m in range(a):
    for n in range(a):
        print('{0:>3}'. format(int(lst[m][n])),end= '\n' if n == a-1 else '')
    if (a - m - 1) != m :
        b = b + int(lst[m][a-1-m]) + int(lst[m][m])
    else :
        b = b + int(lst[m][a-m-1])
print('sum = {}'.format(b))

7-10 杨辉三角

求杨辉三角的前n行数据。

输入格式:
输入n(n<10)值。

输出格式:
输出杨辉三角的前n行数据,每个数据占4列。

输入样例:

5

输出样例:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

n = int(input())
m = []
a = 1
for i in range(n):
    lst = [1]
    for k in range(i):
        lst.append(1) if k == i-1 else lst.append(0)
    m.append(lst)
    if i == 1:
        continue
    
    for j in range(1,i//2+1):
        c = m[i-1][j-1]+m[i-1][j]
        lst[j] = c
        for h in range(1,j+1):
            a = a * h
        if a != i-j:
            lst[-j-1] = c
            
for s in range(n):
    for z in range(s+1):
        print('{0:>4}'. format(int(m[s][z])),end= '\n' if z == s else '')

7-11 求误差小于输入值的e的近似值

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

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

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

输入样例1:
在这里给出一组输入。例如:

0.01

输出样例1:
在这里给出相应的输出。例如:

2.716667

输入样例2:
在这里给出一组输入。例如:

0.000000001

输出样例2:
在这里给出相应的输出。例如:

2.718282

def e(m):
    a = 1
    c = 0
    for n in range(1,m+1):
        for b in range(1,n):
            a = a*b
        c = c +1/a
        a = 1
    return c
error = float(input())
i = 1

while e(i+1) - e(i) > error:
    i = i + 1
print('{0:.6f}'.format(e(i+1)))
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值