听说松花江现在的水很大,容易淹到人,版主小心……
对不礼貌的女生收钱......
#include<stdio.h>
#include<time.h>
#define NMAX 10000
#define NMAX2 100000000
typedef unsigned long UI4;
int isN2(UI4 x)
{ UI4 y0,
y1=x/2;
do
{
y0=y1;
y1=(y0+x/y0)/2;
}
while(y1<y0);
return(y1*y1==x?y1:0);
}
int main()
{ int len=0,ans=0;
UI4 a,a2,b,c,c2;
UI4 t2,t1=clock();
for(a=1;a<NMAX;a++)
{a2=a*a;b=a;
for(++b;(c2=a2+b*b)<=NMAX2;b++)
if(c=isN2(c2))/*此处如有警告可不理*/
{ ans++;
//既测速就关闭printf(...)
//len+=printf("%d,%d,%d ",a,b,c);
//if(len>66)len=0,printf("\n");
}
}
t2=clock();
printf("\ntime unit: %d \n",t2-t1);
printf("\ntotal: %d groups\n",ans);
return 0;
}//在我电脑上:25187个时间单位。
//运行结果1万以内12471组勾股数。
[此贴子已经被作者于2006-5-5 12:56:31编辑过]
//在sizeof(int)==4的环境下,如VC++
#include<stdio.h>
#include<time.h>
#define NMAX 10000
int main()
{
int a,b,c,n=0;
int t2,t1=clock();
for(a=3;a<NMAX;a++)
for(b=a+1;b<NMAX;b++)
for(c=b+1;c<=NMAX;c++)
if(a*a+b*b==c*c)
{
n++;
//printf("%5d%5d%5d,",a,b,c);
//if(n%3==0)
//putchar('\n');
}
t2=clock();
printf("time:%d,groups:%d\n",t2-t1,n);
return 0;
}
//太慢,无法忍受。
先别急着谢各位。我再给你发个最新最快的。
/*----------------------------*
快速搜索NMAX以内的勾股数组
*----------------------------*/
#include<stdio.h>
#include<math.h>
typedef unsigned long int ui4;
ui4 gcd(ui4 u,ui4 v)
{
return v?gcd(v,(ui4)(u%v)):u;
}
int main()
{
char fmt[]="(%?lu,%?lu,%?lu) ";
ui4 NMAX,nmax,m,n,a,b,c,t,tt;
printf("给出搜索上限: ");
scanf("%lu",&NMAX);
nmax=(ui4)sqrt(NMAX);
printf("\n");
fmt[2]=fmt[7]=fmt[12]=(char)
(log(NMAX-1)/log(10)+'1');
tt=t=0;
for(n= 1 ;n< nmax;n++)
for(m=n+1;m<=nmax;m++)
{ c=m*m+n*n;
if(c>NMAX)break;
if((m+n)%2==0)continue;
if(gcd(m,n)-1)continue;
a=2*m*n;
b=m*m-n*n;
if(a>b)a+=b,b=a-b,a-=b;
t++;//统计本原解有多少个
printf(fmt,a,b,c);//输出本原勾股数
if(t%3==0)printf("\n");
tt+=NMAX/c;//统计全部勾股数组
}
if(t%3)printf("\n");
printf("%ld以内共有勾股数%ld组\n",NMAX,tt);
printf("其中本原勾股数仅有%ld组\n\n",t);
return 0;
}