http://acm.hdu.edu.cn/showproblem.php?pid=1868
没想出来盗用别人的思路:
如:15 = 1+2+3+4+5 = 4+5+6 = 7+8,结果为3。设n可以表示成i个连续整数之和,首项为a,则n=a+(a+1)+……(a+i-1)=i*a+(1+2+……+(i-1))=i*a+(i*(i-1)/2)-->a=(n-(i*(i-1)/2))/i 所以我们可以按当前程度i从可能的最大长度k到2(若15=15也算则到1)去试,若能求得首项为整数(可以通过是否能整除判断),则可以表示成i个整数之和。
#include"stdio.h"
int main( )
{
int n,i,max,count;
__int64 sum;
double a;
while(~scanf("%d",&n))
{
sum=0;
for(i=1;i<=n;i++)//找出最多有多少个项连续的和;
{
sum+=i;
if(sum>n)
break;
}
max=i-1;sum=count=0;
for(i=2;i<=max;i++)
{
a=(n-(i*(i-1))/2.0)/(i*1.0);//看首项是否存在;
if((int)(a+0.5)==a)
count++;
}
printf("%d\n",count);
}
return 0;
}