刚开始想着通过a算出b再判断是否满足,但是这样要做n,m中那个小的数次循环,当n和m均很大的时候就会超时,如下:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
__int64 n,m,l,i,b;
double a;
while((cin>>n>>m)&&(n!=0&&m!=0))
{
if(n>m)
l=m;
else
l=n;
for(i=1;i<=l;i++)
{
a=sqrt((i-0.5)*(i-0.5)+2*m)-0.5;
b=a;
if(a==b&&a<=n)
cout<<'['<<i<<','<<b<<']'<<endl;
}
cout<<endl;
}
}
刚开始纠结怎么样让那个循环更小,但是如果那样判断就无法精简,所以就换判断方法:(看别人的代码好久才明白)
因为(b-a+1)<sqrt(2*m);所以设置条件i<sqrt(2*m);从sqrt(2*m)处开始检索,令b-a+1=i,算出2*b=2*m/i+i-1,a=2*m/i-b;
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double n,m;
int a,b,c;
while((cin>>n>>m)&&(n!=0&&m!=0))
{
int i=sqrt(2*m);
c=m;
for(;i>=1;i--)
{
if((2*c)%i==0)判断a+b是否为整数
{
if((2*c/i+i-1)%2==0)//判断b是否为整数
{
b=(2*m/i+i-1)/2;
a=2*m/i-b;
cout<<'['<<a<<','<<b<<']'<<endl;
}
}
}
cout<<endl;
}
}