AcWing 0x00. 语法基础课【Python3】版题解-顺序/判断/循环语句

AcWing语法基础课【Python3】版题解-顺序/判断/循环语句

【AcWing】

【AcWing 语法基础课】

【AcWing 0x00. 语法基础课【Python3】版题解-顺序/判断/循环语句】

【AcWing 0x01. 语法基础课【Python3】版题解-内置数据结构/字符串】

【AcWing 0x02. 语法基础课【Python3】版题解-函数/类和对象/常用库】

顺序语句

例题

【AcWing 1. A+B】

s = input().split()
print(int(s[0])+int(s[1]))

解析:Python3里input()函数输入的字符串,所以要先切割成列表再转换成整型数求和。

另一种写法是:

A, B = map(int, input().split())
print(A+B)

解析:

  1. 在分割字符串后直接把列表中的字符映射为整数,返回迭代器。
  2. 序列分解:只要变量的总数和结构与序列吻合,就可以通过赋值操作把任何序列(或可迭代的对象)分解为单独的变量。

【AcWing 608. 差】

最简单的方法:

A = int(input())
B = int(input())
C = int(input())
D = int(input())
DIFERENCA = A*B - C*D
print("DIFERENCA = "+str(DIFERENCA))

解析:使用强制类型转换str()函数把整型数转换成了字符串。

更简单的写法是:

A = int(input())
B = int(input())
C = int(input())
D = int(input())
print(f"DIFERENCA = {A*B - C*D}")

解析:在Python3.6及其以上,可使用f字符串在字符串中使用变量,具体方法是在引号前加上字母f,再将要插入的变量放在花括号内,这样Python3显示字符串时,会把每个变量都替换为其值。

也可使用格式化字符串的方法:

A = int(input())
B = int(input())
C = int(input())
D = int(input())
print(f"DIFERENCA = %d"%(A*B - C*D))

解析:格式化字符串的基本用法将一个值插入到一个有字符串格式符%的字符串中。

符号 描述
%c 格式化字符及其ASCII码
%s 格式化字符串
%d 格式化整数
%f 格式化浮点数字,可指定小数点后的精度

若用列表和循环,也可:

x = []
for i in range(4):
    x.append(int(input()))
diferenca = x[0]*x[1]-x[2]*x[3]
print("DIFERENCA = "+str(diferenca))

【AcWing 604. 圆的面积】

pi = 3.14159
R = float(input())
A = pi*R**2
print('A=%.4f'%A)

解析:Python3中'%.nf'%A是格式化浮点数字,可以把浮点数A转换成保留n位小数的字符串。

f字符串的方法:

import math
R = float(input())
A = round(math.pi, 5)*R**2
print(f'A={round(A, 4)}')

解析:导入math标准库,使用math.π常量,round(A, n)返回浮点数A保留n位小数(四舍五入)的值。

f字符串直接保留n位小数的方法:

import math
R = float(input())
print(f'A={round(math.pi, 5)*R**2:.4f}')

解析:f"{A:.nf}"是把浮点数A保留n位小数的方法。

【AcWing 606. 平均数1】

A = float(input())
B = float(input())
MEDIA = A*3.5/11 + B*7.5/11
# MEDIA = (A*3.5 + B*7.5)/11
print("MEDIA = %.5f"%MEDIA)

解析: 加权平均值即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。

【AcWing 609. 工资】

number = input()
hours = int(input())
salary = float(input())

salary = hours * salary
print("NUMBER = "+number)
print("SALARY = U$ %.2f"%salary)

解析:直接模拟,输出两个字符串拼接可以直接使用+

【AcWing 615. 油耗】

km = int(input())
l = float(input())
M = km/l
print('%.3f km/l'%M)

解析:直接模拟。

【AcWing 616. 两点间的距离】

s1 = input().split()
s2 = input().split()
distance = ((float(s2[0])-float(s1[0]))**2 +(float(s2[1])-float(s1[1]))**2)**0.5
print('%.4f'%distance)

解析:Python3里对x开根号用的是x**2

第二种方法是使用math标准库里的sqrt()函数:

import math
s1 = input().split()
s2 = input().split()
distance = math.sqrt((float(s2[0])-float(s1[0]))**2 +(float(s2[1])-float(s1[1]))**2)
print('%.4f'%distance)

解析:math.sqrt(x)执行对x开平方的操作。

【AcWing 653. 钞票】

第一种方法是使用保存所有面值的钞票的数量然后再输出:

N = int(input())
money = {100:0, 50:0, 20:0, 10:0, 5:0, 2:0, 1:0}
print(N)
for key in money:
    money[key] = N // key
    N = N % key
    print('%d nota(s) de R$ %d,00'%(money[key], key))

解析:使用字典来保存所有面值的钞票的数量,key是钞票面值,value是该面值的钞票的数量。

第二种方法是不保存所有面值的钞票的数量,直接计算并输出:

N = int(input())
money = [100, 50, 20, 10, 5, 2, 1]
print(N)
for i in money:
    print('%d nota(s) de R$ %d,00'%(N//i, i))
    N = N % i

解析:格式化字符串时,将一个元组的值插入到一个有字符串格式符%的字符串中。

【AcWing 654. 时间转换】

N = int(input())
hours = N // 3600
minutes = (N - hours*3600) // 60
seconds = N - hours*3600 - minutes*60
print(str(hours)+':'+str(minutes)+':'+str(seconds))

解析:直接模拟。

更简单的方法是:

N = int(input())
print("%d:%d:%d"%(N//60//60, N//60%60, N%60))

习题

【AcWing 605. 简单乘积】

x = int(input())
y = int(input())
print(f"PROD = {x * y}")

解析:直接模拟。

【AcWing 611. 简单计算】

s1 = input().split()
s2 = input().split()
print("VALOR A PAGAR: R$ %.2f"%(float(s1[1])*float(s1[2])+float(s2[1])*float(s2[2])))

解析:直接模拟。

【AcWing 612. 球的体积】

R = float(input())
print("VOLUME = %.3f"%((4/3)*3.14159*R**3))

解析:直接模拟。

【AcWing 613. 面积】

A, B, C = map(float, input().split())
print("TRIANGULO: %.3f"%(0.5*A*C))
print("CIRCULO: %.3f"%(3.14159*C*C))
print("TRAPEZIO: %.3f"%((A+B)*C*0.5))
print("QUADRADO: %.3f"%(B*B))
print("RETANGULO: %.3f"%(A*B))

解析:直接模拟。

【AcWing 607. 平均数2】

A = float(input())
B = float(input())
C = float(input())
print(f"MEDIA = {A*0.2 + B*0.3 + C*0.5:.1f}")

解析:直接模拟。

【AcWing 610. 工资和奖金】

name = input()
basesalary = float(input())
monthlyvolume = float(input())
print(f"TOTAL = R$ {basesalary + 0.15*monthlyvolume:.2f}")

解析:直接模拟。

【AcWing 614. 最大值】

a, b, c = map(int, input().split())
max = (a + b + abs(a - b)) * 0.5
max = (max + c + abs(max - c)) * 0.5
print(f"{int(max)} eh o maior")

解析:abs()函数返回参数的绝对值。

【AcWing 617. 距离】

L = int(input())
print(f"{int(L/30*60)} minutos")

解析:直接模拟。

【AcWing 618. 燃料消耗】

T = float(input())
S = float(input())
print(f"{S * T / 12:.3f}")

解析:直接模拟。

【AcWing 656. 钞票和硬币】

import math 
N = float(input())
currency = math.modf(N)

notes = int(currency[1])
NOTAS = [100, 50, 20, 10, 5, 2]
print("NOTAS:")
for i in NOTAS:
    print(f'{notes // i} nota(s) de R$ {float(i):.2f}')
    notes = notes % i

coins100 = int(round(currency[0], 2) * 100) + notes * 100
MOEDAS = [100, 50, 25, 10, 5, 1]
print("MOEDAS:")
for i in MOEDAS:
    print(f'{coins100 // i} moeda(s) de R$ {i/100:.2f}')
    coins100 = coins100 % i

解析:

  1. modf() 方法以元组形式返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
  2. 把硬币的面值扩大一百倍,然后用整除的方法求硬币数量。

【AcWing 655. 天数转换】

N = int(input())
print(f"{N // 365} ano(s)")
print(f"{N % 365 // 30} mes(es)")
print(f"{N % 365 % 30} dia(s)")

解析:N整除365就是求有多少个年(一年365天);N对365取模求的是去除所有年以后还剩多少天,再整除30就是求有多少个月(一月30天);N对365取模后再对30取模就是求去除年数和月数以后还剩多少天。

判断语句

例题

【AcWing 665. 倍数】

A, B = map(int, input().split())
if A % B == 0 or B % A == 0:
    print("Sao Multiplos")
else:
    print("Nao sao Multiplos")

解析:最基础的判断。

也可使用三目运算符:

A, B = map(int, input().split())
print("Sao Multiplos" if A % B == 0 or B % A == 0 else "Nao sao Multiplos")

解析:三目运算符语法为exp1 if contion else exp2

【AcWing 660. 零食】

number, quantity = map(int, input().split())

if number == 1:
    total = quantity * 4.00
elif number == 2:
    total = quantity * 4.50
elif number == 3:
    total = quantity * 5.00
elif number == 4:
    total = quantity * 2.00
else:
    total = quantity * 1.50

print("Total: R$ "+'%.2f'%total)

解析:基础运算中,如果一个操作数是整数,另一个操作数是浮点数,那么结果也总是浮点数。

如果我们注意到零食编号和列表下标具有一一对应的映射关系,则这道题甚至不需要使用判断语句:

number, quantity = map(int, input().split())
price = [4.00, 4.50, 5.00, 2.00, 1.50]
print("Total: R$ %.2f"%(price[number-1]*quantity))

【AcWing 659. 区间】

F = float(input())
if F < 0 or F > 100:
    print("Fora de intervalo")
elif F > 75:
    print("Intervalo (75,100]")
elif F > 50:
    print("Intervalo (50,75]")
elif F > 25:
    print("Intervalo (25,50]")
else:
    print("Intervalo [0,25]")

解析:先判断是否超出范围,然后从大到小顺次判断F的区间。

【AcWing 664. 三角形】

A, B, C = map(float, input().split())
x = []
x.append(A)
x.append(B)
x.append(C)
x.sort()
if x[0] + x[1] > x[2]:
    print(f"Perimetro = {A + B + C:.1f}")
else:
    print(f"Area = {(A + B) * C * 0.5:.1f}")

解析:把A,B,C填入列表,然后对列表用sort()方法排序,然后再用判定三角形是否成立的方法:两边之和大于第三边。

【AcWing 667. 游戏时间】

A, B = map(int, input().split())
if A == B:
    print("O JOGO DUROU 24 HORA(S)")
elif A < B:
    print(f"O JOGO DUROU {B - A} HORA(S)")
else:
    print(f"O JOGO DUROU {24 - A + B} HORA(S)")

解析:分三次判断A和B谁大谁小即可。

【AcWing 669. 加薪】

N = float(input())
Z = 0

if N <= 400.00:
    Z = 0.15
elif N <= 800.00:
    Z = 0.12
elif N <= 1200.00:
    Z = 0.1
elif N <= 2000.00:
    Z = 0.07
else:
    Z = 0.04
    
Y = N * Z
X = N + Y
print(f"Novo salario: {X:.2f}")
print(f"Reajuste ganho: {Y:.2f}")
print(f"Em percentual: {int(Z * 100)} %")

解析:从小到大顺次判断N的区间。

【AcWing 670. 动物】

Phylum = input()
Class = input()
Habits = input()
if Phylum == "vertebrado":
    if Class == "ave":
        if Habits == "carnivoro":
            print("aguia")
        else:
            print("pomba")
    else:
        if Habits == "onivoro":
            print("homem")
        else:
            print("vaca")
else:
    if Class == "inseto":
        if Habits == "hematofago":
            print("pulga")
        else:
            print("lagarta")
    else:
        if Habits == "hematofago":
            print("sanguessuga")
        else:
            print("minhoca")

解析:嵌套条件语句,直接模拟。

这道题也可以不使用条件语句,而使用嵌套字典来实现:

animals = {
    "vertebrado": {
        "ave": {
            "carnivoro": "aguia",
            "onivoro": "pomba",
        },
        
        "mamifero": {
            "onivoro": "homem",
            "herbivoro": "vaca",
        },
    },
    
    "invertebrado": {
        "inseto": {
            "hematofago": "pulga",
            "herbivoro": "lagarta",
        },
        
        "anelideo": {
            "hematofago": "sanguessuga",
            "onivoro": "minhoca",
        },
    },
}
Phylum = input()
Class = input()
Habits = input()
print(((animals[Phylum])[Class])[Habits])

解析:嵌套字典的索引依然要遵循dictionary[key]的方法,外层字典要用()包裹作为一个整体。

索引print(((animals[Phylum])[Class])[Habits])相当于:

a = animals[Phylum]  # 第一层字典
b = a[Class]         # 第二层字典
c = b[Habits]        # 第三层字典
print(c)

习题

【AcWing 657. 选择练习1】

A, B, C, D = map(int, input().split())
flag1 = flag2 = flag3 = flag4 = flag5 = 0
if B > C:
    flag1 = 1
if D > A:
    flag2 = 1
if C + D > A + B:
    flag3 = 1
if C > 0 and D > 0:
    flag4 = 1
if A % 2 == 0:
    flag5 = 1
if flag1 and flag2 and flag3 and flag4 and flag5:
    print("Valores aceitos")
else:
    print("Valores nao aceitos")

解析:通过设置flag来标志每个条件是否达到。

当然也可以合并到一行写:

A, B, C, D = map(int, input().split())
print("Valores aceitos") if B > C and D > A and C > 0 and D > 0 and A % 2 == 0 else print("Valores nao aceitos")

【AcWing 671. DDD】

DDD = int(input())
dic = {61: "Brasilia", 71: "Salvador", 11: "Sao Paulo", 21: "Rio de Janeiro", 32: "Juiz de Fora", 19: "Campinas", 27: "Vitoria", 31: "Belo Horizonte"}
if DDD in dic:
    print(dic[DDD])
else:
    print("DDD nao cadastrado")

解析:判断DDD是否在字典中即可。

【AcWing 662. 点的坐标】

X, Y = map(float, input().split())
if X > 0 and Y > 0:
    print("Q1")
elif X < 0 and Y > 0:
    print("Q2")
elif X < 0 and Y < 0:
    print("Q3")
elif X > 0 and Y < 0:
    print("Q4")
elif X == 0 and Y == 0:
    print("Origem")
elif X == 0:
    print("Eixo Y")
else:
    print("Eixo X")

解析:分情况判断即可。

【AcWing 666. 三角形类型】

edge = list(map(float, input().split()))
edge.sort(reverse=True)
A, B, C = edge
if A >= B + C:
    print("NAO FORMA TRIANGULO")
elif A**2 == B**2 + C**2:
    print("TRIANGULO RETANGULO")
elif A**2 > B**2 + C**2:
    print("TRIANGULO OBTUSANGULO")
else:
    print("TRIANGULO ACUTANGULO")

if A == B and B == C:
    print("TRIANGULO EQUILATERO")
elif A != B and B != C and C != A:
    pass
else:
    print("TRIANGULO ISOSCELES")

解析:因为上述条件可能满足不止一条,所以要分多条件并列判断。sort()方法中指定参数reverse=True可以对列表反向排序。

【AcWing 668. 游戏时间2】

A, B, C, D = map(int, input().split())
hours = minutes = 0
if A == C and B == D:
    hours = 24

if A < C or (A == C and B < D):
    hours = C - A
    minutes = D - B
    if minutes < 0:
        hours -= 1
        minutes += 60
elif A > C or (A == C and B > D):
    hours = 24 - A - 1 + C
    minutes = 60 - B + D
    if minutes > 60:
        hours += 1
        minutes = minutes % 60

print(f"O JOGO DUROU {hours} HORA(S) E {minutes} MINUTO(S)")

解析:直接模拟,一步一步分情况判断游戏持续时间。

A, B, C, D = map(int, input().split())
hours = minutes = 0

if A == C and B == D:
    totalminutes = 24 * 60
elif A < C or (A == C and B < D):
    totalminutes = (C - A) * 60 + D - B
else:
    totalminutes = (24 - A - 1 + C) * 60 + 60 - B + D
    
hours = totalminutes // 60
minutes = totalminutes % 60
print(f"O JOGO DUROU {hours} HORA(S) E {minutes} MINUTO(S)")

解析:先计算出以分钟为单位的总游戏时间,然后再划分成小时和分钟。

【AcWing 672. 税】

salary = float(input())
tax = 0
money1 = salary - 2000.01
money2 = salary - 3000.01
money3 = salary - 4500
if money1 < 0:
    money1 = 0
else:
    money1  = 999.99 if money1 > 999.99 else money1
if money2 < 0:
    money2 = 0
else:
    money2  = 1499.99 if money2 > 1499.99 else money2
if money3 < 0:
    money3 = 0
tax = money1 * 0.08 + money2 * 0.18 + money3 * 0.28
if tax == 0:
    print("Isento")
else:
    print(f"R$ {tax:.2f}")

解析:先计算出各部分的钱,然后再求其分别乘以税率的和。

【AcWing 663. 简单排序】

A, B, C = map(int, input().split())
A0, B0, C0 = A, B, C
if A > B:
    A, B = B, A
if B > C:
    B, C = C, B
if A > B:
    A, B = B, A
print(A)
print(B)
print(C)
print()
print(A0)
print(B0)
print(C0)

解析:先比较A,B的大小,把大的放在后面,再比较B,C的大小,把大的放在后面,这是最后一个数一定是最大的,最后再比较一次A,B的大小,把小的放在前面大的放在后面,即完成三个数排序。

N = list(map(int, input().split()))
M = sorted(N)
for i in M:
    print(i)
print()
for i in N:
    print(i)

解析:这道题可以使用sorted()函数来完成,sorted()函数对列表进行临时排序,并不改变原本列表中的元素。

【AcWing 658. 一元二次方程公式】

a, b, c = map(float, input().split())
delta = b**2 - 4 * a * c
if a == 0 or delta < 0:
    print("Impossivel calcular")
elif delta == 0:
    R1 = R2 = - b / (2 * a)
    print(f"R1 = {R1:.5f}")
    print(f"R2 = {R2:.5f}")
else:
    R1 = (- b + delta**0.5) / (2 * a)
    R2 = (- b - delta**0.5) / (2 * a)
    print(f"R1 = {R1:.5f}")
    print(f"R2 = {R2:.5f}")

解析:分情况讨论一元二次方程的根就行。

【AcWing 661. 平均数3】

N1, N2, N3, N4 = map(float, input().split())
X = N1 * 0.2 + N2 * 0.3 + N3 * 0.4 + N4 * 0.1
print(f"Media: {X:.1f}")
if X > 7.0:
    print("Aluno aprovado.")
elif X < 5.0:
    print("Aluno reprovado.")
else:
    print("Aluno em exame.")
    Y = float(input())
    print(f"Nota do exame: {Y:.1f}")
    Z = (X + Y) / 2
    if Z >= 5.0:
        print("Aluno aprovado.")
    else:
        print("Aluno reprovado.")
    print(f"Media final: {Z:.1f}")

解析:直接模拟。

循环语句

例题

【AcWing 708. 偶数】

even = 2
while even < 101:
    print(even)
    even += 2

解析:while循环解法。

for even in range(2, 101, 2):
    print(even)

解析:for循环解法。

【AcWing 709. 奇数】

X = int(input())
odd = 1
while odd <= X:
    print(odd)
    odd += 2

解析:while循环解法。

X = int(input())
print("1")
for odd in range(3, X+1, 2):
    print(odd)

解析:for循环解法。

【AcWing 712. 正数】

i = 1
count = 0
while i < 7:
    x = float(input())
    if x > 0:
        count += 1
    i += 1
print(f"{count} positive numbers")

解析:while循环解法。

count = 0
for i in range(6):
    x = float(input())
    if x > 0:
        count += 1
print(f"{count} positive numbers")

解析:for循环解法。

【AcWing 714. 连续奇数的和1】

X = int(input())
Y = int(input())
oddSum = 0
if X < Y:
    X, Y = Y, X
while X > Y + 1:
    X -= 1
    if X % 2 == 1:
        oddSum += X
print(oddSum)

解析:while循环解法。

X = int(input())
Y = int(input())
oddSum = 0
if X < Y:
    X, Y = Y, X
for i in range(X-1, Y, -1):
    if i % 2 == 1:
        oddSum += i
print(oddSum)

解析:for循环解法,range()函数指定步长为负数时即可生成递减序列。

【AcWing 716. 最大数和它的位置】

integer = []
maxn = (0, 0)
for i in range(100):
    integer.append(int(input()))
    if maxn[0] < integer[i]:
        maxn = (integer[i], i + 1)
print(maxn[0])
print(maxn[1])

解析:用元组存储最大数和它的位置,循环输入数值并判断当前最大数是否小于输入数值,若是,则更新元组。

活用Python3语法,这道题可以更简便的完成:

integer = [int(input()) for i in range(100)]
maxn = max(integer)
print(maxn)
print(integer.index(maxn)+1)

解析:先通过列表解析创建一百个整数的列表,然后用max()函数求出列表元素的最大值,再用index()方法求出最大值对应的位置。

【AcWing 721. 递增序列】

while True:
    try:
        X = int(input())
        if X > 0:
            for i in range(1, X+1):
                print(i, end=' ')
            print()
        else:
            pass
    except:
        break

解析:Python3模拟文件输入需要try except语句,在文件输入结束时用break跳出死循环。

import sys
for line in sys.stdin:
    x = int(line)
    if x > 0:
        for i in range(1, x+1):
            print(i, end=' ')
        print()

解析:另一种模拟文件读入的方法是使用sys.stdin读入文件

【AcWing 720. 连续整数相加】

N = list(map(int, input().split()))
A = N[0]
sum = 0
for i in range(A, A+N[-1]):
    sum += i
print(sum)

解析:直接使用列表反向索引得到N的值。

【AcWing 724. 约数】

N = int(input())
for i in range(1, N+1):
    if N % i == 0:
        print(i)

解析:直接在for循环里判断是否为约数,若是则打印。

【AcWing 723. PUM】

N, M = map(int, input().split())
matrix = [[i * M + j for j in range(1, M+1)] for i in range(N)]

for i in range(N):
    for j in range(M):
        if j == M-1:
            print("PUM", end = " ")
        else:
            print(matrix[i][j], end=" ")
    print()

解析:matrix = [[i * M +j for j in range(1, M+1)] for i in range(N)]等价于

matrix = []
for i in range(N):
    matrix.append([]) # 先在外层循环填入行
    for j in range(1, N+1):
        matrix[i].append(i * M + j) # 再在内层循环填入列

习题

【AcWing 715. 余数】

N = int(input())
for i in range(1, 10000):
    if i % N == 2:
        print(i)

解析:for循环遍历即可。

【AcWing 710. 六个奇数】

X = int(input())
if X % 2 == 0:
    for i in range(X+1, X+12, 2):
        print(i)
else:
    for i in range(X, X+11, 2):
        print(i)

解析:直接模拟,指定for循环迭代步长为2。

【AcWing 711. 乘法表】

N = int(input())
for i in range(1, 11):
    print(f"{i} x {N} = {i*N}")

解析:直接模拟即可。

【AcWing 718. 实验】

N = int(input())
dic = {"C": 0, "R": 0, "F": 0}
for i in range(N):
    s = input().split()
    dic[s[1]] += int(s[0])
total = dic["C"] + dic["R"] + dic["F"]
print("Total: %d animals" % total)
print("Total coneys: %d" % dic["C"])
print("Total rats: %d" % dic["R"])
print("Total frogs: %d" % dic["F"])
print("Percentage of coneys: %.2f %%" % (dic["C"] / total * 100))
print("Percentage of rats: %.2f %%" % (dic["R"] / total * 100))
print("Percentage of frogs: %.2f %%" % (dic["F"] / total * 100))

解析:直接模拟,在字符串格式化中 ‘%%‘输出一个单一的’%’。

【AcWing 713. 区间2】

N = int(input())
X = [int(input()) for i in range(N)]
In = Out = 0
for x in X:
    if x >= 10 and x <= 20:
        In += 1
    else:
        Out += 1
print(f"{In} in")
print(f"{Out} out")

解析:直接模拟即可。

【AcWing 719. 连续奇数的和2】

N = int(input())
for i in range(N):
    X, Y = map(int, input().split())
    if X > Y:
        X, Y = Y, X
    if X == Y:
        print("0")
    else:
        Sum = 0
        for j in range(X+1, Y):
            if j % 2 == 1:
                Sum += j
        print(Sum)

解析:直接模拟即可。

【AcWing 717. 简单斐波那契】

N = int(input())
a = 0
b = 1
for i in range(N):
    print(a, end=" ")
    a, b = a+b, a

解析:for循环迭代,每次令 a n = a n − 1 + a n − 2 a_n=a_{n-1}+a_{n-2} an=an1+an2,然后令现在的 a n a_n an a n − 1 a_{n-1} an1作为下一次迭代的 a n − 1 a_{n-1} an1 a n − 2 a_{n-2} an2

【AcWing 722. 数字序列和它的和】

while True:
    try:
        M, N = map(int, input().split())
        if M > N:
            M, N = N, M
        if M <= 0:
            break
        Sum = 0
        for i in range(M, N+1):
            Sum += i
            print(i, end=" ")
        print(f"Sum={Sum}")
    except:
        break

解析:直接模拟即可,但要注意需要题意模拟文件读入。

【AcWing 725. 完全数】

N = int(input())
for i in range(N):
    X = int(input())
    Sum = 0
    for i in range(1, X):
        if X % i == 0:
            Sum += i
    if Sum == X:
        print(f"{X} is perfect")
    else:
        print(f"{X} is not perfect")

这道题直接模拟会超时,所以需要优化算法:

N = int(input())
for i in range(N):
    X = int(input())
    if X == 1:
        print(f"{X} is not perfect")
    else:
        Sum = 1
        Y = int(X**0.5) + 1
        for j in range(2, Y):
            if X % j == 0:
                Z = X // j
                if Z == j:
                    Sum += j
                else:
                    Sum = Sum + j + Z
        if Sum == X:
            print(f"{X} is perfect")
        else:
            print(f"{X} is not perfect")

解析:以28为例,如果4是28的约数,那么28//4=7也是28的约数,28的一对约数一定分布在 28 = 5.2915 \sqrt{28}=5.2915 28 =5.2915两侧,而且一个数开方的值可能恰好是它的约数。因此就可以把内循环次数降到 X \sqrt{X} X

【AcWing 726. 质数】

N = int(input())
for i in range(N):
    X = int(input())
    flag = 1
    for i in range(2, int(X ** 0.5 + 1)):
        if X % i == 0:
            print(f"{X} is not prime")
            break
    else:
        print(f"{X} is prime")

解析:一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除,则称该数为质数。Python的for...else 语法可以简化代码,循环语句支持 else 子句;for 循环中,可迭代对象中的元素全部循环完毕时,或while 循环的条件为假时,执行该子句;break 语句终止循环时,不执行该子句。

【AcWing 727. 菱形】

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

解析:找规律,直接模拟。

这道题可以用曼哈顿距离求解,参考【AcWing 727. 菱形 - Python3】

你可能感兴趣的:(AcWing题解,python)