勾股数问题

一.问题描述

        如果直角三角形三条边长均为整数,这三个整数组成的数组就称为勾股数组,对于勾股数组(a,b,c),根据定理有关系式:a^2 + b^2=c^2

  问题: 有一种勾股数组(a,b,c),使得b=a+1.例如: 3^2+4^2=5^2;

 用程序找出指定范围(1<c<N)内所有的这种数组,注意选择最佳算法. (1<N<10000)

二. 分析

   1.遍历求解:这类算法最简单,也最耗时.两个遍历条件得到结果的算法复杂度是0(n^2),显然这不是好算法.

  2.递归算法:

       设 a,b,c为一组勾股数, 设 m= c--a,有 a^2+(a+1)^2=(a+m)^2;

   视m 为常数,解得: a= m--1+sqrt(2*m*(m-1))

 因a是整数,故2*m*(m-1)是完全平方数,有整数n>=0,使得:

 2*m*(m-1)=(m+n)^2;    1

解m得:

   m ==n+1+sqrt((n+1)^2+n^2);

因为m是整数,故(n+1)^2+n^2是完全平方数.

当n=0时,代入得到a=3,b=4,c ==5.

当n<>0时,n,n+1,sqrt((n+1)^2+n^2)构成一组勾股数.

可见,除3,4,5外,所有其他勾股数组均可逆向使用上述公式,由另一组比较小的勾股数推出.

由 1 得: m^2 =n^2 +2m+2mn

     2m(m-1) = n^2+m^2+2mn=(m+n)^2.

所以:  a = m-1+n+m=n+2*m-1=n + 2*b(n) +2*c(n) --1;

总结递推公式如下:

 a(0)=3

b(0)=4

c(0)=5

a(n+1) = a(n) +2*b(n) +2*c(n) -1

b(n+1)=a(n+1) +1;

c(n+1)=a(n+1) +b(n) +c(n)

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fisher_jiang/archive/2006/04/20/671018.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值