问题的描述
一个正整数有可能可以被表示为n(n>=2)个连续的正整数之和
如:
15=7+8
15=4+5+6
15=1+2+3+4+5
根据上面的规则,输入一个正整数,找出所有可能的序列(可能没有)
解决办法
这个正整数n其实就是我们在高中数学里面学的等差数列的和的一个特殊情况。
我们先来复习一下高中数学:
等差数列{an}的通项公式为:an=a1+(n-1)d
前n项和公式为:Sn=n*a1+n(n-1)d/2或Sn=n(a1+an)/2 (后一个在本题中用不上)
请注意:
正整数n就是公差为1的等差数列之和
设x为这个等差数列的第一项,i为等差数列项的个数,公差为1
代入上面的求和公式
得:
** n=x*i+i(i-1)/2 **
我们想要得到等差数列的各个项,必须要对x和i进行讨论
x必须是正整数,可得:
x>=1
由上式 x=(n-i*(i-1)/2)/i
所以 x=(n-i*(i-1)/2)/i>=1
经过变换可得: 2n>=i^2+i
=> 2n>=i^2
其次,我们要得到一个连续的正整数,i必须大于2,由此我们得到了i的范围
【2,{\sqrt2n}】
得到了x,i的条件就可以很轻松的求等差数列的各项了
代码
//连续的正整数之和
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void function(int n)
{
int i,j,x,flag=0;
for(i=2;i<=sqrt(2*n);i++)//i的范围
{
if((n-i*(i-1)/2)%i==0)//x是正整数,所以余数为0
{
flag=1;
x=(n-i*(i-1)/2)/i;
j=0;
while(j<i)
{
printf("%d ",x);
x++;
j++;
}
printf("\n");
}
}
if(flag==0)//如果没有连续的正整数
{
printf("Nothing\n");
}
}
int main()
{
function(15);
return 0;
}
结果展示
结尾
这道题其实不难,考的是高中数学,数学其实才是解决问题的有力工具