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

今天是2024年的清明节,20240404这个数字让我提出了一个疑问,它是否有什么含义或者特点呢?

首先,如果把它拆分为两个整数的平方和,会怎么样呢?

于是,我一顿操作猛如虎,搞出了这么个玩意:(基础版)

n = int(input())
found = Falsefor 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 = Trueif not found:print("data error!")n = int(input())
find_sum_of_squares(n)​

一下子把时间复杂度降下来了,真不错。

我们测试一下吧:

貌似结果还不错,但是好像有重复的,怎么改呢?

ohoh,原来是没有跳出内层循环呢,原来如此,看我大展身手

以下就是改良版的终极代码了:(终极版)

import mathdef 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 = Truebreakif not found:print("data error!")n = int(input())
find_sum_of_squares(n)

妙不可言!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596943.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的并发世界(七)——互斥锁

0.死锁的由来 假设有两个线程T1和T2,它们需要对两个互斥量mtx1和mtx2进行访问。而且需要按照以下顺序获取互斥量的所有权: -T1先获取mte1的所有权,再获取mt2的所有权。 -T2先获取 mtx2的所有权。再铁取 mtx1的所有权。 如果两个线程同时执行&#xff0c…

Linux下Qt生成程序崩溃文件

文章目录 1.背景2.Qt编译生成程序2.1.profile模式的本质 3.执行程序,得到core文件4.代码定位4.1.直接使用gdb4.2.使用QtCreator 5.总结6.题外话6.1.profile模式和debug模式的区别 1.背景 在使用Qt时,假如在windows,当软件崩溃时,…

百度文心大模型推理成本降至1% / 马斯克起诉OpenAI |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件🔥,更新AIGC的最新动态,生成相应的魔法简报,节省阅读时间👻 🔥资讯预览 百度文心大模型推理成本降至1%,与三星、荣耀等企业达成合作 马斯…

12-2-CSS 字体图标

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 CSS 字体图标1 字体图标的产生2 字体图标的优点3 字体图标的下载4 字体图标的…

第十二天--二维数组的彻底解刨--地址

1.二维数组我们用父子的地址来称呼二维数组的地址 比如arr[3][4] 这里的arr是二维数组的首地址,也是父数组的首地址,也是子数组的首地址 arr1父数组的地址偏移1,实际上是偏移了4*416个字节 arr[0]是子数组的首地址,arr[0]1是子数…

算法设计与分析实验报告c++实现(哈夫曼编码、最小生成树、背包问题、汽车加油问题)

一、 实验目的 1.加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 用贪心算法…

Ubuntu部署LangChain-Chatchat

个人博客:https://blog.lukeewin.top 更多内容欢迎访问我的博客。 一、环境 OS: Ubuntu 20.04 PyTorch: 2.0.0 Python: 3.8 CUDA: 11.8 GPU: RTX 4090 24GB CPU: 12 vCPU Intel(R) Xeon(R) Platinum 8352V CPU 2.10GHz RAM: 90GB 硬盘: 180GB LLM: Chatglm3-6b E…

如何在Python中将HTML实体代码转换为文本

在处理HTML数据时&#xff0c;有时会遇到HTML实体代码&#xff0c;这些代码是为了在HTML中表示特殊字符而使用的。例如&#xff0c;<表示小于符号(<)&#xff0c;>表示大于符号(>)&#xff0c;&表示和符号(&)等等。那么当我们在实际操作中可能会遇到下面的…

vue+elementUI实现表格组件的封装

效果图&#xff1a; 在父组件使用表格组件 <table-listref"table":stripe"true":loading"loading":set-table-h"slotProps.setMainCardBodyH":table-data"tableData":columns"columns.tableList || []":ra…

【Ambari】Ansible自动化部署大数据集群

目录 一&#xff0e;版本说明和介绍信息 1.1 大数据组件版本 1.2 Apache Components 1.3 Databases支持版本 二&#xff0e;安装包上传和说明 三&#xff0e;服务器基础环境配置 3.1global配置修改 3.2主机名映射配置 3.3免密用户名密码配置 3.4 ansible安装 四. 安…

地面站Mission Planner从源码编译与运行

0. 环境 - win10&#xff08;基本需要100G硬盘&#xff09; - ubuntu18 1. 安装vs2022 下载 vs2022 community 在线安装包。 https://visualstudio.microsoft.com/ 打开 Visual Studio Installer 先安装 Visual Studio Community 2022本体。占用1.2GB。 Visual Studio Inst…

批量导入svg文件作为图标使用(vue3)vite-plugin-svg-icons插件的具体应用

目录 需求svg使用简述插件使用简述实现安装插件1、配置vite.config.ts2、src/main.ts引入注册脚本3、写个icon组件4、使用组件 需求 在vue3项目中&#xff0c;需要批量导入某个文件夹内数量不确定的svg文件用来作为图标&#xff0c;开发完成后能够通过增减文件夹内的svg文件&a…