問題描述 :
一個等差數列是一個能表示成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;
}