勾股数 (迅雷笔试题)

描述

勾股数,是由三个正整数组成的数组;能符合勾股定理 aa + bb = c*c , (a, b, c) 的正整数解。如果 (a, b, c) 是勾股数,它们的正整数倍数,也是勾股数。如果 (a, b, c) 互质,它们就称为素勾股数。给定正整数N,计算出小于或等于N的素勾股数个数。(0 < a <= b <= c <= N)

输入

正整数N

输出

小于或等于N的素勾股数个数(0 < a <= b <= c <= N)

输入样例 1  

10                                                                                                                                                                                                

输出样例 1

1

 扩展知识:

所谓勾股数,一般是指能够构成直角三角形三条边的三个正整数(例如a,b,c)。

即a*a+b*b=c*c; a,b,c∈N

又由于,任何一个勾股数(a,b,c)内的三个数同时乘以一个整数n得到的新数(na,nb,nc)仍然是勾股数,所以一般我们要找的是a,b,c三者互质(他们的最大公因数是1)的勾股数,即素勾股数

产生素勾股数的方式:

设m > n 、m 和n 均是正整数,

 

am^2 − n^2;

b = 2mn;

c = m^2+n^2;

 

若m 和n 是互质,而且m 和n 其中有一个是偶数,计算出来的 (a, b, c) 就是素勾股数

并且能够找到所有的素勾股数  

实现代码:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int m=(int) Math.sqrt(n);
		int a,b,c;
		int count=0;
		for(int i=1;i<=m;i++)
		{
			for(int j=i+1;j<=m;j+=2)
			{
				if(gcd(i,j)==1)  //i和j必须互质,即最大公因数为1
				{
					a=j*j-i*i;
					b=2*i*j;
					c=i*i+j*j;
					if(c<=n)count++;
				}
			}
		}
		System.out.println(count);

	}

	private static int gcd(int a,int b)
	{
		if(b==0)return a;
		else return gcd(b,a%b);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值