增加两个变量m,n;
令x=m^2-n^2;
y=2*m*n;
z=m^2+n^2;(m、n奇偶性不同)
对m、n进行枚举即可,注意控制上限,以免超时
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int x,y,z,ct,k,N;
bool vis[1000010];
while(scanf("%d",&N)==1)
{
memset(vis,0,sizeof(vis));
ct=0;k=0;
for(int m=1;m<=sqrt(N+0.0);m++)
{
for(int n=1;n<=sqrt(N+0.0);n++)
{
if(m*m+n*n>N)break;
if(gcd(m,n)==1&&(m%2+n%2==1)&&m>=n)
{
x=m*m-n*n;
y=2*m*n;
z=m*m+n*n;
if(x<=N&&y<=N&&z<=N)
{
ct++;
vis[x]=1;vis[y]=1;vis[z]=1;
for(int i=2;i*x<=N&&i*y<=N&&i*z<=N;i++)
{
vis[i*x]=1;
vis[i*y]=1;
vis[i*z]=1;
}
}
}
}
}
for(int i=1;i<=N;i++)
if(!vis[i])k++;
printf("%d %d\n",ct,k);
}
return 0;
}