草庐IT

python练习题四

不许代码码上红 2023-04-08 原文

题目解析第四期来了,通过将一道一道题目的深度刨析,让我们一起培养我们的算法思维吧!
💕💕💕预告,本例题包含对矩阵的螺旋输出操作、逆鞍点的寻找等…

文章目录

一、数字螺旋方阵

🎈🎈🎈输入一个正整数n,要求输出n×n个数字构成的螺旋方阵。

输入格式: 首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入一个正整数n(0~20)。

输出格式: 对于每组测试,输出n×n的数字螺旋方阵。(各行数据间间隔6个字符宽度。)

第一步,“首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。”,我们读懂并且搞定输入:

T = eval(input())
for i in range(T):
    n = eval(input())

第二步,“每组测试输入一个正整数n(0~20)”,限制n的数据范围:

 if n>20:
        print("error!")
 else:

第三步,“输入一个正整数n,要求输出n×n个数字构成的螺旋方阵”,例如我们输入的n为2:

第一列第二列
43
21
我们需要完成上述效果。
第四步,编写逻辑函数实现要求:
当输入n的值为0或者1的时候输出0和1:
def spot(tup, x, y, num, n):
    if n <= 0: return 0
    if n == 1:
        tup[x][y] = num

当n属于[2,20),我们需要逐行、逐列地对矩阵进行赋值,不难发现:

数据从下标为【0,0】的元素开始沿着逆时针减少。
第一行,向右移动,第一个下标x=0不变,第二个下标y=0增加:

    for i in range(n):
        tup[x][y + i] = num
        num -= 1

最后一列,向下移动,第一个下标x=0增加,第二个坐标y=n-1不变:

    for i in range(n - 1):
        tup[x + 1 + i][y + n - 1] = num
        num -= 1

最后一行,向左移动,第一个下标x=n-1不变,第二个下标y=n-2减少:

    for i in range(n - 1):
        tup[x + n - 1][y + n - 2 - i] = num
        num -= 1

第一列,向上移动,第一个下标x=n-2开始减少,第二个下标y=0不变:

    for i in range(n - 2):
        tup[x + n - 2 - i][y] = num
        num -= 1

第一圈即最外圈已经排完,接下来重复上述操作逐步向内:

  spot(tup, x + 1, y + 1, num, n - 2)

完整代码:

def spot(tup, x, y, num, n):
    if n <= 0: return 0
    if n == 1:
        tup[x][y] = num
    for i in range(n):
        tup[x][y + i] = num
        num -= 1
    for i in range(n - 1):
        tup[x + 1 + i][y + n - 1] = num
        num -= 1
    for i in range(n - 1):
        tup[x + n - 1][y + n - 2 - i] = num
        num -= 1
    for i in range(n - 2):
        tup[x + n - 2 - i][y] = num
        num -= 1
    spot(tup, x + 1, y + 1, num, n - 2)


T = eval(input())
for i in range(T):
    n = eval(input())
    if n>20:
        print("error!")
    else:
        ls = [[0] * n for i in range(n)]
        spot(ls, 0, 0, n * n, n)
        for x in ls:
            print("%4d" * n % tuple(x))

运行效果:

二、求矩阵中的逆鞍点

🎈🎈🎈求出n×m二维整数数组中的所有逆鞍点。这里的逆鞍点是指在其所在的行上最大,在其所在的列上最小的元素。若存在逆鞍点,则输出所有逆鞍点的值及其对应的行、列下标。若不存在逆鞍点,则输出“Not”。要求至少使用一个自定义函数。

输入格式: 测试数据有多组,处理到文件尾。每组测试的第一行输入n和m(都不大于100),第二行开始的n行每行输入m个整数。

输出格式:
对于每组测试,若存在逆鞍点,则按行号从小到大、同一行内按列号从小到大的顺序逐行输出每个逆鞍点的值和对应的行、列下标,每两个数据之间一个空格;若不存在逆鞍点,则在一行上输出“Not”(引号不必输出)。

第一步,分析题目输入输出,发现本题并没有说明以何种符号结束输入,于是我们选择while循环主体模式:

while True:
    try:
        n, m = map(int, input().split(" "))
        if n>100 or m>100:
            print("error!")
            break
        spot(n,m)
    except:
        break

第二步,题目分析:

第一列第二列第三列第四列
1234
5678
9101112
13141516
在这样一个矩阵中,我们需要输出4和4的坐标0,4。
第三步,逻辑代码实现;
def spot(a,b):
    line = {}
    column = {}
    for i in range(1, a + 1):
        tmp = list(map(int, input().split()))
        line[i] = tmp
    tmp = []
    for j in range(1, b + 1):
        tmp = []
        for i in range(1, a + 1):
            tmp.append(line[i][j - 1])
        column[j] = tmp
    num = 0
    for i in range(1, a + 1):
        for j in range(1, b + 1):
            if line[i][j - 1] == max(line[i]) and line[i][j - 1] == min(column[j]):
                num += 1
                print("{} {} {}".format(line[i][j - 1], i - 1, j - 1))
    if num == 0:
        print("Not")

完整代码:

def spot(a,b):
    line = {}
    column = {}
    for i in range(1, a + 1):
        tmp = list(map(int, input().split()))
        line[i] = tmp
    tmp = []
    for j in range(1, b + 1):
        tmp = []
        for i in range(1, a + 1):
            tmp.append(line[i][j - 1])
        column[j] = tmp
    num = 0
    for i in range(1, a + 1):
        for j in range(1, b + 1):
            if line[i][j - 1] == max(line[i]) and line[i][j - 1] == min(column[j]):
                num += 1
                print("{} {} {}".format(line[i][j - 1], i - 1, j - 1))
    if num == 0:
        print("Not")
while True:
    try:
        n, m = map(int, input().split(" "))
        if n>100 or m>100:
            print("error!")
            break
        spot(n,m)
    except:
        break

运行效果:

三、旋转矩阵

🎈🎈🎈对于一个奇数n阶方阵,请给出经过顺时针方向m次旋转后的结果。

输入格式:
测试数据有多组,处理到文件尾。每组测试的第一行输入2个整数n,m(1<n<20,1≤m≤100),接下来输入n行数据,每行n个整数。

输出格式: 对于每组测试,输出奇数阶方阵经过m次顺时针方向旋转后的结果。每行中各数据之间留一个空格。

第一步,同样发现题目没有明确地输入结束标志,选则while结构。
第二步,输入格式;

题目中,要求n的值在(1,20)、m的值在[1,100];定义l列表运用map()函数将数插入。

  n, m = map(int, input().split())
        if  1<n<20 and 1<=m<=100:
            l = list()
            for i in range(n):
                l.append(list(map(int, input().split())))

第三步,核心算法;
🎈🎈🎈从右边逐步将每一列进行翻转,记得把翻转后的数据储存到一个新的空矩阵中!!!

    for x in range(m):
                data = []
                for i in range(n):
                    t = []
                    for j in range(n):
                        t.insert(0, l[j][i])
                    data.append(list(t))
                    t.clear()
                l = data
            for i in range(n):
                for j in range(n-1):
                    print(l[i][j], end=" ")
                print(l[i][n-1])

完整代码:

while True:
    try:
        n, m = map(int, input().split())
        if  1<n<20 and 1<=m<=100:
            l = list()
            for i in range(n):
                l.append(list(map(int, input().split())))
            for x in range(m):
                data = []
                for i in range(n):
                    t = []
                    for j in range(n):
                        t.insert(0, l[j][i])
                    data.append(list(t))
                    t.clear()
                l = data
            for i in range(n):
                for j in range(n-1):
                    print(l[i][j], end=" ")
                print(l[i][n-1])
        else:
            print("error!")
            break
    except:
        break

运行效果:

四、两个矩阵之积

🎈🎈🎈输入整数m、p、n,再输入一个m行p列的整数矩阵A和一个p行n列的整数矩阵B,求两个矩阵的乘积AB

输入格式: 测试数据有多组,处理到文件尾。每组测试数据的第一行输入n(1<m,p,n<10),接下来分别输入A矩阵和B矩阵。

输出格式: 对于每组测试,输出m行,每行n个整数,表示AB的结果,每行中每两个数据之间留一个空格。

第一步,搞定输入格式要求:

 m,p,n=map(int,input().split())
        if 1<m<10 and 1<n<10 and 1<p<10:

第二步,创建两个行、列分别为(m,p)、(p,n)的矩阵,并为其输入值。

for i in range(m):
                    l.append(list(map(int,input().split())))
      
            for i in range(p):
                    x.append(list(map(int,input().split())))

第三步,核心算法:

 for i in range(m):
                for u in range(n):
                    sum=0
                    for j in range(p):
                        pro=l[i][j]*x[j][u]
                        sum=sum+pro

完整代码:

while True:
    try:
        m,p,n=map(int,input().split())
        if 1<m<10 and 1<n<10 and 1<p<10:
            l=[]
            x=[]
            for i in range(m):
                    l.append(list(map(int,input().split())))
      
            for i in range(p):
                    x.append(list(map(int,input().split())))
           
            k=0

            res=[[0]*n for i in range(m)]
           




            for i in range(m):
                for u in range(n):
                    sum=0
                    for j in range(p):
                        pro=l[i][j]*x[j][u]
                        sum=sum+pro
                    
                    res[i][u]=sum
        

        for x in res:
            print(("%d " * n % tuple(x)).strip())
    except:
        break

运行效果:

五、古典问题:兔子

🎈🎈🎈有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少?

第一个月第二个月第三个月第四个月第五个月第六个月
1对1对2对3对5对8对

答案:

for i in range(1,22):
    print ('%12ld %12ld' % (f1,f2), end=" ")
    if (i % 3) == 0:
        print ('')
    f1 = f1 + f2
    f2 = f1 + f2

运行效果:

六、素数查找

🎈🎈🎈 判断1-100之间有多少个素数,并输出所有素数。

答案:

h = 0
leap = 1
from math import sqrt
for m in range(1,101):
    k = int(sqrt(m + 1))
    for i in range(2,k + 1):
        if m % i == 0:
            leap = 0
            break
    if leap == 1:
        print ('%-4d' % m)
        h += 1
        if h % 10 == 0:
            print ('')
    leap = 1
print ('The number is %d' % h)

运行效果:

七、水仙花数

🎈🎈🎈打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。

答案:

for n in range(100,1000):
    i = n / 100
    j = n / 10 % 10
    k = n % 10
    if n == i ** 3 + j ** 3 + k ** 3:
        print(n)
    i = n // 100
    j = n // 10 % 10
    k = n % 10
    if n == i*i*i + j*j*j + k*k*k: 
        print(n)

运行效果:

八、将一个正整数分解质因数

🎈🎈🎈例如:输入90,打印出90=233*5
答案:

def reduceNum(n):
    if n in [1] :
        print ('{}'.format(n))
    while n not in [1] : 
        for index in range(2, n + 1) :
            if n % index == 0:
                n //= index 
                if n == 1: 
                    print (index )
                else : 
                    print ('{} *'.format(index), end=" ")
                break
reduceNum(90)
reduceNum(100)

运行效果:

九、统计

🎈🎈🎈输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

s = input('')
letters = 0
space = 0
digit = 0
others = 0
for c in s:
    if c.isalpha():
        letters += 1
    elif c.isspace():
        space += 1
    elif c.isdigit():
        digit += 1
    else:
        others += 1
print ('char = %d,space = %d,digit = %d,others = %d' % (letters,space,digit,others))

运行效果:

十、求和

🎈🎈🎈求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

答案:

from functools import reduce
 
Tn = 0
Sn = []
n = int(input('n = '))
a = int(input('a = '))
for count in range(n):
    Tn = Tn + a
    a = a * 10
    Sn.append(Tn)
    print (Tn)
 
Sn = reduce(lambda x,y : x + y,Sn)
print ("计算和为:",Sn)

运行效果:

✨✨✨✨欢迎三连~~~~

有关python练习题四的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  6. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  7. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  8. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

  9. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  10. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

随机推荐