由高斯公式可得:(i+(i+j-1)) * j / 2 = m(用 i表示首项, j表示项数, i+j-1得到末项)
由上式得: i = ((2 * m)/j - j + 1)/2;
为了减少循环的次数,可由上式得到:j * j + 2 * i * j - j = 2m; 且i大于等于1;则2 * i * j - j >0;
所以j < sqrt(2 * m);
代码如下:
#include <iostream>
#include<math.h>
using namespace std;
int main() {
int n,m,len,a;
while (cin>>m>>n&&m+n!=0) {
for(len=sqrt(2*m);len>=1;len--){
a=(2*m/len-len+1)/2; //计算首项
if((2*a+len-1)*len/2==m){ //求和
printf("[%d,%d]\n",a,a+len-1);
}
}
cout<<endl; //每个输出结构空一行
}
return 0;
}