问题描述 :
一个等差数列是一个能表示成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++
#includeusing namespace std; int main() { int isDnum[100000]={0};//表示双平方数 int i=0,j=0; int n,m; int a=0,b=0; int flag=0; //标记是否找到满足条件的数列,默认没有找到 int scope=0; //数的范围 cin>>n>>m; scope=m*m*2; for(i=0;i<=m;i++){ //找出双平方数集合 for(j=i;j<=m;j++){ isDnum[i*i+j*j]=1; } } for(b=1;(n-1)*b<=scope;b++){//从b开始,保证先按照b排序,再按a排序 for(a=0;a+((n-1)*b)<=scope;a++){ for(i=0;i<=n-1;i++){ if(isDnum[a+i*b]==0){ break; } } if(i>n-1){ flag=1; printf("%d %dn",a,b); } } } if(flag==0){ printf("NONEn"); } return 0; }



