用等差求和公式,直接代(a1+an)*n/2((首数+尾数)*个数/2)时超时了,参考了http://blog.csdn.net/cs_zlg/article/details/7387423
另w为个数,i为首数,i+w即为尾数,w从0开始,2*M为和。
所以个数为w+1,所以有(i+i+w)*(w+1)=2*M
易知w+1<i+i+w(因为i从1开始计数)
所以一定有(w+1)*(w+1)<2*M
即w+1<sqrt(2*M) 这里的2*M要强制类型转换成实数类型,具体看下面代码
所以w<sqrt(2*M)-1 即个数从w依次向0递减,
然后再根据等式(i+i+w)*(w+1)=2*M求得i=(2*M/(w+1)-w)/2
然后...看代码
#include<stdio.h>
#include<math.h>int main()
{
int i,M,N,w;
while(scanf("%d %d",&N,&M)!=EOF)
{
if(N==0&&M==0)
return 0;
for(w=sqrt((double)2*M)-1;w>=0;w--)//记得sqrt()函数里要实型
{
i=(2*M/(w+1)-w)/2;
if((i+i+w)*(w+1)==2*M)
printf("[%d,%d]\n",i,i+w);
}
printf("\n");//根据题意每次结束后来一个回车
}
return 0;
})