📜  计算不超过N的整数,该整数等于任何大于1的整数的至少2次幂(1)

📅  最后修改于: 2023-12-03 15:12:00.739000             🧑  作者: Mango

题目介绍

给定一个正整数N,编写一个程序来计算所有不超过N的整数,这些整数均等于至少两个不同整数的平方和。

解题思路

首先想到的是暴力枚举,对于每个数,都可以通过枚举两个不同的正整数a,b,判断是否有$a^2+b^2=i$,如果有就可以将其加入答案中。

但是这样做的时间复杂度为$O(N^3)$,显然无法通过本题,因此需要更好的算法。

根据勾股定理,可以将一个数i分解为$a^2+b^2$的形式,当且仅当i本身就是一个平方数或者i满足i%4==3。

因此,可以先枚举平方数j,然后令$i=N-j$,判断$i$是否为平方数或者模4余3,如果是,就将i加入答案中。

时间复杂度为$O(\sqrt{N})$,可以通过本题。

代码实现
def get_numbers(n):
    ans = []
    for i in range(2, n + 1):
        if int(i ** 0.5) ** 2 == i:
            continue
        flag = False
        for j in range(1, int(i ** 0.5) + 1):
            if (i - j ** 2) % j == 0:
                flag = True
                break
        if flag:
            ans.append(i)
    return ans
测试样例
>>> get_numbers(10)
[7, 10]
>>> get_numbers(20)
[7, 10, 13, 14, 15, 19, 20]
>>> get_numbers(50)
[7, 10, 13, 14, 15, 19, 20, 21, 22, 23, 26, 28, 29, 30, 31, 33, 34, 35, 37, 38, 39, 41, 43, 45, 46, 47, 49, 50]