20240404这个数字有什么特点吗?

今天是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)

妙不可言!

点赞加关注,下期更精彩!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值