【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)
解析:
【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
解析:
modf()
方法以元组形式返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。【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=an−1+an−2,然后令现在的 a n a_n an和 a n − 1 a_{n-1} an−1作为下一次迭代的 a n − 1 a_{n-1} an−1和 a n − 2 a_{n-2} an−2。
【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】