题意:给出一个n,问小于等于n的数中有多少组互质勾股数,除了所有勾股数外还有多少个数字。
题解:有一个勾股数的公式,其中a b c是勾股数。
int a = i * i + j * j;
int b = 2 * i * j;
int c = i * i - j * j;
然后将a、b、c扩大k倍(小于等于n),避免遗漏,然后写gcd函数判断是否互质。
#include <stdio.h>
#include <string.h>
#include <math.h>
int vis[1000005];
bool gcd(int a, int b) {
int c;
while (b > 0) {
c = a % b;
a = b;
b = c;
}
if (a == 1)
return true;
return false;
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
memset(vis, 0, sizeof(vis));
int res = 0, res2 = 0;
int m = sqrt(n);
for (int i = 1; i <= m; i++)
for (int j = i + 1; j <= m; j++) {
int c = j * j + i * i;
if (c > n)
break;
int a = j * j - i * i;
int b = 2 * i * j;
if (gcd(a, b) && gcd(a, c) && gcd(b, c)) {
res++;
vis[a] = vis[b] = vis[c] = 1;
for (int k = 2; k * c <= n; k++)
vis[k * a] = vis[k * b] = vis[k * c] = 1;
}
}
for (int i = 1; i <= n; i++)
if (!vis[i])
res2++;
printf("%d %d\n", res, res2);
}
return 0;
}