只能这样说。。。一道数学题
如果是奇数,肯定能分解成至少两数相加的模式。
如果是偶数:
假设一个数num能被分解为n个以a为开头的数之和,则必然满足下公式:
M=a+(a+1)+(a+2)+…+(a+n-1)=n*a+n*(n-1)/2;
要求a!=0,否则就是以a+1开头的连续n-1个整数了,也就是要求(M-(n+n*(n-1)/2))%n==0,即(M-(n*(n-1)/2))%n==0,这样就很容易判断一个数可不可以写成连续n个自然数的形式了,遍历n=2…sqrt(M)*2,还可以输出所有解。
void divide(int num)
{
int i,j,a;
for(i = 2; i <= sqrt((double)num) * 2; ++i)
{
if((num - i * (i-1) / 2) % i == 0)
{
a = (num - i * (i-1) / 2) / i;
if(a > 0)
{
for(j = 0; j<i; ++j)
cout<<a + j<<" ";
}
cout<<endl;
}
}
}