
听说松花江现在的水很大,容易淹到人,版主小心……
 
										
					
	
对不礼貌的女生收钱......
 2006-05-05 12:06
	    2006-05-05 12:06
   2006-05-05 12:08
	    2006-05-05 12:08
   2006-05-05 12:14
	    2006-05-05 12:14
  
 13楼的程序运行结束用时 312毫秒
 13楼的程序运行结束用时 312毫秒
班主同志:并没有人说您老的代码慢呀。也没有自吹13楼的快呀 。滑稽
。滑稽 。
。

 2006-05-05 12:15
	    2006-05-05 12:15
  #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编辑过]

 2006-05-05 12:31
	    2006-05-05 12: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;
}
//太慢,无法忍受。

 2006-05-05 12:55
	    2006-05-05 12:55
   2006-05-06 20:56
	    2006-05-06 20:56
  先别急着谢各位。我再给你发个最新最快的。
/*----------------------------*
 快速搜索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;
}

 2006-05-06 21:00
	    2006-05-06 21:00