上篇文章求1~100范围内容勾股数元组,运行正常;但是后来把范围调整到1000,程序就运行得超级慢,笔记本差点死机。试着改良一下程序,花了一晚上时间,重写了一版。

这次程序运行快了很多,求1千以内勾股数元组2秒运行完,1万以内用时234秒。

再次优化,发现平方和开平方能开得尽就是勾股数,省略了中间的一个步骤,求1万以内的勾股数元组,用时182秒。

---------------------------------------------------------------------------------------------------------------------------------

思路:

勾股数的公式 a² + b² = c² ,其中a、b、c这3个数都是正整数。假设a < b < c,在c未知的情况下,我可以先在1万内找出a和b,设x = a² + b² = c²,很明显对x开平方的结果是一个正整数,因此第一步要做的,就是把平方和开不尽的情况给过滤掉,这节省了很多计算量。

---------------------------------------------------------------------------------------------------------------------------------

import time
import math

start_time = time.time()

tri_list = [] #勾股数列表
final_list = [] #两两互质的勾股数列表,即勾股数元组

#判断两个数是否互质
def isCoprime(x,y):
    if x < y:
        return isCoprime(y,x)
    while y > 1:
        tmp = y
        y = x % y
        x = tmp
    return y

#对两个数求平方和,再开平方,判断结果是否为整数
#如果为整数,返回这个整数;否则,返回None
def is_sqrt_int(a,b):     
    square_ab = a**2 + b**2
    #对i,j的平方和开平方
    c = math.sqrt(square_ab)
    #转换为字符串,方便统计小数点之后的字符串长度
    s1 = str(c)
    idx = s1.index(".")
    #如果使用sqrt方法对一个数开平方能开尽,小数点右边只有一个0,加上小数点,长度为2
    #使用pow方法没有小数点,所以这里用小于等于2判断
    #如果开不尽,长度大于2
    if len(s1[idx::]) <= 2:
        return int(c)
    else:
        return None

#求正整数 n~ m 之间的勾股数元组
def js_ggs(m,n):
    #先计算勾股数中较小的两个值的平方和,假设i < j
    #对(i²+j²)开平方,如果结果是一个整数k,说明(i,j,k)是一组勾股数
    #因为之前设定好i<j,可知i<j<k
    #如果平方和开不尽,说明不符合要求,得过滤掉
    for i in range(m,n):
        for j in range(m,n):
            #设定好两个数的顺序,i<j
            #这是一个组合 i²+j² = j² +i²
            #取(i,j)即可,不用再取(j,i)
            if i < j:
                k = is_sqrt_int(i,j)
                if k is not None:
                    s2 = [i,j,int(k)]
                    #验证通过,k是整数,加入勾股数列表
                    tri_list.append(s2)

#按要求取出勾股数两两互质的情况
    for i in range(0,len(tri_list)):
        x = tri_list[i][0]
        y = tri_list[i][1]
        z = tri_list[i][2]
        c1 = isCoprime(x,y)
        c2 = isCoprime(x,z)
        c3 = isCoprime(y,z)
        if c1 == 1 and c2 == 1 and c3 == 1:
            final_list.append(tri_list[i])

#调用方法
m = 1
n = 10000
js_ggs(m,n)

print("%s~%s范围内的勾股数个数:" % (m,n))
print(len(tri_list))
#print(tri_list)
print("%s~%s范围内的勾股数元组(3个数字两两互质)个数:" % (m,n))
print(len(final_list))
print("%s~%s范围内的勾股数元组内容(前5个):" % (m,n))
print("")
#从最终结果取出前5个,看一下是否符合要求
for i in range(5):
    print(final_list[i])
       
print("")    
print("程序运行时间(秒):")
end_time = time.time() - start_time
print(end_time)

---------------------------------------------------------------------------------------------------------------------------------

程序运行结果:

1~10000范围内的勾股数个数:
14471
1~10000范围内的勾股数元组(3个数字两两互质)个数:
1788
1~10000范围内的勾股数元组内容(前5个):[3, 4, 5]
[5, 12, 13]
[7, 24, 25]
[8, 15, 17]
[9, 40, 41]程序运行时间(秒):
182.7406623363495

用Python求1~1万范围内的勾股数元组相关推荐

  1. 华为OD机试真题 Python 实现【勾股数元组】

             所有题目均有五种语言实现.C实现目录.C++ 实现目录.Python实现目录.Java实现目录.JavaScript实现目录<

  2. 求勾股数元祖(java)

    一道华为笔试题,这道题思路挺简单的,符合简单题的属性.但是我却AC不了,包括现在我也没看出来漏了什么.最后通过50%的用例,剩下的百度也没找到原因. 先记录一下吧. 数字<10000,所以用in ...

  3. 【华为OD机试真题 Python】勾股元组

    前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你.关于OD机试流程.面经.面试指导等,如有任何疑问,欢迎联系我,wechat:steven ...

  4. python求最小值不能使用min和sotred_python基础——内置函数

    python基础--内置函数  一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highl ...

  5. python求扇形面积_Python随机生成均匀分布在单位圆内的点代码示例

    Python有一随机函数可以产生[0,1)区间内的随机数,但是如果我们想生成随机分布在单位圆上的,那么我们可以首先生成随机分布在单位圆边上的点,然后随机调整每个点距离原点的距离,但是我们发现这个距离不 ...

  6. 手把手教你用Python求均值、中值和众数

    导读:数据科学入门:集中趋势度量--均值.中值和众数. 作者:保罗·戴特尔(Paul Deitel).哈维·戴特尔(Harvey Deitel) 来源:大数据DT(ID:hzdashuju) 本文我们 ...

  7. python求极限中有算术平方根如何表达_Python求算数平方根和约数的方法汇总

    Python求算数平方根和约数的方法汇总 一.求算术平方根 a= x=int(raw_input('Enter a number:')) if x >= : while a*a < x: ...

  8. python求列表list平均值的方法

    python求列表list平均值的步骤 python内置了两个函数,sum()和len()方法,其中sum()可以用于求取列表的元素和,len()函数可以用于求取列表list元素的个数,由此,利用py ...

  9. python求三个数平均值_python求三个数平均值

    本文收集整理关于python求三个数平均值的相关议题,使用内容导航快速到达. 内容导航: Q1:利用python3.x计算任意数据平均值 l=[1,2,3]def ave(a):print(sum(a ...

最新文章

  1. LeetCode 3. Longest Substring Without Repeating Characters-- c++,java,python解法
  2. 在CSDN中如何转载别人的博客
  3. Vue-CLI@4——html-webpack-plugin默认配置的获取与修改
  4. 怎么用js调用C#后台方法
  5. 2018.10.13 bzoj1834: [ZJOI2010]network 网络扩容(最大流+费用流)
  6. 解题报告——例题5-8 Unix is 命令(UVa 400)——26行代码解决
  7. c++如何禁用指定的键盘布局_Karabiner Elements for Mac 键盘键位自定义改键工具
  8. vue 组件 - 非单文件组件
  9. spring容器_Spring容器文档阅读要点记录
  10. Windows系统下各浏览器常用CSS hack汇总表图
  11. WM 仓库管理T-CODE
  12. 2018蓝桥杯 明码 解题方法
  13. Vue 接入firebase验证、Google登陆、Facebook登陆完整流程
  14. Python学习——三分钟分析目前最火的电视剧
  15. 《谁动了我的奶酪》读后感 他人感悟
  16. Ariduino入门笔记——1. Arduino 默认函数(数字接口/模拟接口)
  17. 达梦数据库 ,无效的列名, org.springframework.dao.DataIntegrityViolationException: Hibernate-related JDBC operat
  18. teamlab什么意思_不好意思,我们的2019毕业季聚会,和前辈的不一样
  19. 你会算对象的大小么?不会的话就看看这篇文章吧
  20. mysql中的left和right

热门文章

  1. Linux下如何安装MySQL 5.0
  2. 资讯的服务器维护指什么,资讯
  3. 3t硬盘分区 Linux win,3TB使用大难题 得先学会怎么分区_内存硬盘行情-中关村在线...
  4. 记一次频繁YoungGC生产问题排查思路及解决方案
  5. Flink优化02--状态及Checkpoint调优
  6. EtherNet/IP协议开发2:理论学习
  7. 西门子PLC1200-组态王跟Access数据库--⑪查询数据库
  8. trackerslist GitHub12月无重复更新版
  9. 一分钟教你们证件照如何换背景颜色,快来收藏
  10. 计算机cpu的主频参数,电脑CPU的参数怎么看?原来这么简单!