勾股数

程序地址:http://www.cheemoedu.com/exercise/16

问题描述:

所谓勾股数,一般是指能够构成直角三角形3条边的3个正整数(a,b,c)。
即a2+b2=c2,a,b,cΣN
求1000以内的勾股数。

我的思路:使用for循环列出所有的数,连续判断是否满足a2+b2=c2关系,满足的就是勾股数,但是要注意,三个数中任意一个都不可以为0,且重复的如3,4,5和4,3,5要去除,只留下其中一个;

我的代码:

for i in range(1,1000):
    for j in range(i+1,1000):
        for k in range(1000):
            if i**2+j**2==k**2:
                print i,j,k

示例代码:

import math
for a in range(1, 1000):
    for b in range(a + 1, 1000):
        c = math.sqrt(a * a + b * b)
        if c > 1000:
            break
        if c.is_integer():
            print a, b, int(c)

代码分析:想来想去也就想到了这个写法,但是很明显,我的代码很臃肿,运行速度非常慢,效率也非常低,毕竟基数大,还用了三个for循环。

而示例代码明显比我的高效,它只循环了两次,使用math模块的sqrt函数求得a2+b2的平方根值(注意该值的类型为浮点型,不是整型),然后判断该值是否在1000以内,并且判断该值是否为有限的浮点型数,如果是就打印出a,b和整型化的c;

总结:

  1. math模块的函数说明

2.关于is_integer的说明:

is_integer就是判断一个浮点数是否是有限的,如果是就返回True,否则返回False;

http://python-reference.readthedocs.io/en/latest/docs/float/is_integer.html

时间: 2024-10-24 00:42:58

勾股数的相关文章

关于勾股数的规律

有可能是初中写的最后一篇了,中考啊~~以前跟一些人提到过,互质的勾股数a,b,c(即a²+b²=c²)都满足一个规律(其实互质满足了,那么不互质也一定满足):当a为奇数时:b=(a²-1)/2c=(a²+1)/2当a为偶数时:b=a²/4-1c=a²/4+1那么,这个条件是否充分呢(就是说当a,b,c满足以上规律时,这三个数是否为互质的勾股数)?显而易见,如果不要求互质的话,这是绝对满足的,证明如下:当a为奇数时:a²+b²=a²+[(a²-1)/2]²=a²+(a²-1)²/4=a²+(a^4

勾股数---Python

传说存在唯一一组勾股数,三个数的和是1000,那么它的积是多少呢? def judge(a,b,c):    if a+b<=c or b+c<=a or a+c<=b:        return 0    if a*a+b*b==c*c or b*b+c*c==a*a or a*a+c*c==b*b:        return 1    result=0for i in range(1,1000):    for j in range(1,1000-i):        k=100

Uva 106-Fermat vs. Pythagoras(勾股数性质)

题目链接:点击打开链接 题意:给出N,x^2+y^2=z^2 小于等于N的解(互素)的个数以及小于N的个数除掉所有解(包括不互素)已经用掉的数. 度娘给出勾股数的定义:只考虑互素的解,给出勾股数公式 a=2*m*n ,b=m*m-n*n ,c=m*m+n*n;  枚举m,n ,复杂度 O(log(N)^2) #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib&g

UVA106 - Fermat vs. Pythagoras(素勾股数)

题目链接 题目大意:给你一个数n,勾股数三元组(x,y,z)的定义:满足x < y < z, x^2 + y^2 = z^2.现在问这里里面有多少个三元组是素勾股数即满足x,y, z两两互质.并且判断剩下的1-n的数有多少是没有出现在勾股数三元组中. 解题思路:先找出所有的素勾股数(x, y, z) ,那么便可以通过(kx, ky, kz)得到不是素勾股数的勾股数.接着要换种方式构造素勾股数,公式:x = m^2 - n^2; y = 2?m?n; z = m^2 + n^2:其中若 m 和

迅雷笔试题_素勾股数的个数

题目: 勾股数,是由三个正整数组成的数组:能符合勾股定理 a*a + b*b = c*c ,(a, b, c) 的正整数解.如果 (a, b, c) 是勾股数,它们的正整数倍数,也是勾股数.如果 (a, b, c) 互质,它们就称为素勾股数.给定正整数N, 计算出小于或等于N的素勾股数个数. 样例输入: 10 样例输入: 1 思路: 产生素勾股数的方式: 设m > n .m 和n 均是正整数, a=m2-n2 b=2mn c= m2+n2 若m 和n 是互质,而且m 和n 其中有一个是偶数,计算

HDU 6441 费马大定理+勾股数

#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define fi first #define se second #define all(a) (a).begin(), (a).end() #define fillchar(a, x) memset(a, x, sizeof(a)) #define huan printf("\n") #define debug(a,b) cout<

计算所有小于N的勾股数组合,可以写入txt文件保存,每组占一行。

1 #ifndef PYTHAGOREAN_H_ 2 #define PYTHAGOREAN_H_ 3 #include <iostream> 4 class Pythagorean { 5 public: 6 // 打印出边长小于 n 的符合勾股定理的三角形的三边长度 7 // print right triangles' sides (sides < n) 8 // 可以指定输出流,默认为std::cout 9 std::ostream& operator()(int n,

【2018CCPC网络赛 1004】Find Integer(勾股数+费马大定理)

Problem Description people in USSS love math very much, and there is a famous math problem . give you two integers n,a,you are required to find 2 integers b,c such that an+bn=cn. Input one line contains one integer T;(1≤T≤1000000) next T lines contai

2015浙工大校赛-Problem C: 三角—— 费马大定理+勾股数

题目 有一个直角三角形三边为 A,B,C 三个整数.已知 C 为最长边长,求一组B,C,使得B和C最接近. (题目链接) 分析 打表找规律. 或者直接一点的枚举 $C-B$ 的值.(既然枚举 B 不现实,枚举差值是一种很好的思路啊,学习了 %%% 博客) 或者使用费马大定理(的一小部分), 当 $A$ 为奇数时($A > 1$),存在 $C-B = 1$ 的整数解使得 $A^2 + B^2 = C^2$: 当 $A$ 为偶数时 ($A > 2$),存在 $C-B = 2$ 的整数解使得 $A^