45 等差數列

問題描述 :

一個等差數列是一個能表示成a, a+b, a+2b,…, a+nb (n=0,1,2,3,…) 在這個問題中a是一個非負的整數,b是正整數。

寫一個程序來找出在雙平方數集合S中長度爲n的等差數列。雙平方數集合是所有能表示成p2+q2的數的集合。

輸入說明 :

第一行: N(3<= N<=25),要找的等差數列的長度。 第二行: M(1<= M<=250),搜索雙平方數的上界0 <= p,q <= M。

輸出說明 :

如果沒有找到數列,輸出`NONE’。

如果找到了,輸出一行或多行, 每行由兩個整數組成:a,b 這些行應該先按b排序再按a排序(均爲升序)。

將不會有多於10,000個等差數列。

輸入範例 :

5 7

輸出範例 :

1 4
37 4
2 8
29 8
1 12
5 12
13 12
17 12
5 20
2 24

c源碼:

#include<stdio.h>
#include<memory.h>
int main()
{
   int N,M,a[50000],b[2][1000],i,j,l,t,x,y;
   while(scanf("%d%d",&N,&M)!=EOF)
   {  memset(a,0,50000);
     memset(b,0,1000);
      for(i=0;i<=M;i++)
		  for(j=i;j<=M;j++)
		  {
		      a[i*i+j*j]=1;//直接位置查找
		
		  }
	t=0;
    for(i=0;i+(N-1)<=2*M*M;i++)
		for(j=1;i+j*(N-1)<=2*M*M;j++)
		{  for(l=0;l<N;l++)
			{
			    if(a[i+l*j]==0)
					break;//不在,找別的
			}
		if(l==N)
		{  b[0][t]=i;
	     	b[1][t]=j;
		  t++;
		}
        }
  if(t==0)
	  printf("NONE\n");

  else
  {
     for(i=0;i<t;i++)
		 for(j=0;j<t-i-1;j++)
             if(b[1][j]>b[1][j+1])
			 {
			 x=b[0][j];y=b[1][j];b[0][j]=b[0][j+1];b[1][j]=b[1][j+1];b[0][j+1]=x;b[1][j+1]=y;
			 }
			 else
			 {
			      if(b[1][j]==b[1][j+1])
				  {
				      if(b[0][j]>b[0][j+1])
				        {
			               x=b[0][j];y=b[1][j];b[0][j]=b[0][j+1];b[1][j]=b[1][j+1];b[0][j+1]=x;b[1][j+1]=y;
					  }
				  }
			 }
  }//else

  for(i=0;i<t;i++)
	  printf("%d %d\n",b[0][i],b[1][i]);

   }

		 return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章