📅  最后修改于: 2023-12-03 15:07:34.061000             🧑  作者: Mango
这是一道ISRO CS 2013考试的编程题,需要求解一个数学问题。
给定一个正整数N,计算所有2 <= i <= N 以及 2 <= j <= N,并且满足(i + j)的最高质因子是5的(i, j)对的数量。例如,如果N = 15,那么这样的(i, j)对为:(2, 3), (2, 8), (2, 13), (3, 2), (3, 7), (3, 12), (4, 5), (4, 10), (5, 2), (5, 8), (5, 13), (7, 3), (7, 12), (8, 2), (8, 5), (8, 13), (10, 4), (10, 11), (11, 10), (12, 3), (12, 7), (13, 2), (13, 5), 和 (13, 8),因此答案为 24。
一个整数N(2 <= N <= 10000)
一个整数,表示所有(i, j)对的数量。
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def highest_prime_factor(n):
i = 5
while i * i <= n:
if n % i == 0:
n //= i
else:
i += 2 if i > 5 else 4
return n
def main():
n = int(input())
count = 0
for i in range(2, n + 1):
for j in range(2, n + 1):
if highest_prime_factor(i + j) == 5:
count += 1
print(count)
if __name__ == '__main__':
main()
这道题需要枚举所有的 (i, j) 对,判断它们相加的最高质因子是否为 5。
为了判断一个数的最高质因子是否为 5,可以使用 highest_prime_factor 函数。该函数使用了一种叫做试除法(trial division)的算法,从 5 开始试除,以 2、4、2、4、2、4、…… 的方式不断尝试相邻的两个质数。
对于每一个满足条件的 (i, j),都将计数器 count 加 1,最后输出 count 即可。
需要注意的是,在高效实现代码的时候,可以使用技巧将高频访问的对于质数的判定和对于5的最高质因子判断缓存好。