高斯在上小学时发明了等差数列求和公式:1+2+..+100=5050。现在问题在于给你一个正整数n,问你他可以表示为多少种连续正整数之和?(自身也算)。
输入格式:
多组数据,每组数据一行,一个正整数n。0<n<2000000000
输出格式:
每组数据一行,包含一个正整数,表示结果。
输入样例
5
120
输出样例:
2
4
解释:
5=2+3=5
120=1+2+...+15=22+23+24+25+26=39+40+41=120
思路:
正整数n,当除数a为奇数且能被除尽时,易看出n=n/a-(a-1)/2+...+n/a+...+n/a+(a-1)/2 符合题意,如9/3=3,9=3-1+3+3+1=2+3+4;当除数a为偶数时,当且仅当n/a的小数部分是0.5时能凑成连续整数和,如9/2=4.5,9=4+5。
代码如下:
#include <iostream>
using namespace std;
int main()
{
long n;
while (cin>>n)
{
int count = 0;
for (int i = 1;(double)n/i-i/2>0; i++)
{
if ((i%2&&!(n%i))||(!(i%2)&&(((double)n/i-n/i)==0.5)))
{
count++;
}
}
cout<<count<<endl;
}
return 0;
}