题目:
勾股数,是由三个正整数组成的数组;能符合勾股定理 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 其中有一个是偶数,计算出来的 (a, b, c) 就是素勾股数。
并且能够找到所有的素勾股数。
实现:
1 long long isHuzhi(long long a, long long b) { 2 return b == 0 ? a : gcd(b, a % b); 3 } 4 5 int main() { 6 7 while (scanf("%lld", &n) != EOF) { 8 int count = 0; 9 long long m = sqrt(n); 10 long long a, b, c; 11 12 for (long long i = 1; i <= m; i++) { 13 for (long long j = i + 1; j <= m; j += 2) { 14 if (isHuzhi(j, i) == 1) { 15 a = j * j - i * i; 16 b = 2 * i * j; 17 c = i * i + j * j; 18 19 if (c <= n) { 20 count++; 21 } 22 } 23 } 24 } 25 26 printf("%d\n", count++); 27 } 28 return 0; 29 }