今天是2024年的清明节,20240404这个数字让我提出了一个疑问,它是否有什么含义或者特点呢?
首先,如果把它拆分为两个整数的平方和,会怎么样呢?
于是,我一顿操作猛如虎,搞出了这么个玩意:(基础版)
n = int(input())
found = False
for i in range(0, n + 1):
for j in range(i, n + 1):
if i ** 2 + j ** 2 == n:
print(f'{i}^2 + {j}^2 = {n}')
found = True
if found:
break # 找到符合条件的 i 和 j 后跳出外层循环
if not found:
print("data error!")
刚输入几个100以内的数字,效果还不错,秒出答案,可是当输入大一点的数字时,似乎出了大毛病,它卡壳了,当输入20240404时,它一点点也不动了,哎
我扭头一想,现在这个算法的时间复杂度是O(n**2),怪不得速度这么慢,那么有没有什么好的办法呢?
既然是要找出符合以上条件的代码,何不转换一下思路呢!
要提高这个算法的效率,可以做一些优化。当前的算法是通过嵌套循环逐个计算 i 和 j 的平方和,并在找到符合条件的情况下输出。这种方法会导致算法的时间复杂度较高,因为它需要遍历很多不必要的情况。
一个提高效率的方法是利用数学性质来减少计算量。
根据题意,要找到满足 i^2 + j^2 = n 的 i 和 j,可以利用勾股定理的性质。具体来说,当 n 是一个整数时,如果存在整数 i 和 j,使得 i^2 + j^2 = n 成立,那么 n 一定可以表示为两个平方数的和。这个性质可以用来减少计算量。妙呀,这个想法真不错,适合我们!
于是根据以上思路,我们推出以下算法:(完善版)
def find_sum_of_squares(n):
found = False
# 尝试所有可能的平方数对
for i in range(1, int(math.sqrt(n)) + 1):
j = math.sqrt(n - i ** 2)
if j.is_integer():
print(f'{int(i)}^2 + {int(j)}^2 = {n}')
found = True
if not found:
print("data error!")
n = int(input())
find_sum_of_squares(n)
一下子把时间复杂度降下来了,真不错。
我们测试一下吧:
貌似结果还不错,但是好像有重复的,怎么改呢?
ohoh,原来是没有跳出内层循环呢,原来如此,看我大展身手
以下就是改良版的终极代码了:(终极版)
import math
def find_sum_of_squares(n):
found = False
# 尝试所有可能的平方数对
for i in range(1, int(math.sqrt(n)) + 1):
j = math.sqrt(n - i ** 2)
if j.is_integer():
print(f'{int(i)}^2 + {int(j)}^2 = {n}')
found = True
break
if not found:
print("data error!")
n = int(input())
find_sum_of_squares(n)
妙不可言!
点赞加关注,下期更精彩!