勾股數 (迅雷筆試題)
阿新 • • 發佈:2018-12-10
描述
勾股數,是由三個正整陣列成的陣列;能符合勾股定理 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 均是正整數,
a = m^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); } }