1. 程式人生 > >勾股數 (迅雷筆試題)

勾股數 (迅雷筆試題)

描述

勾股數,是由三個正整陣列成的陣列;能符合勾股定理 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);
	}
}