/*小提示:判断一个数是否是2的方幂 n > 0 && ((n & (n - 1)) == 0 )题目:输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如:15=1+2+3+4+515=4+5+615=7+8有些数可以写成连续N(>1)个自然数之和,比如14=2+3+4+5;有些不能,比如8.那么如何判断一个数是否可以写成连续N个自然数之和呢?一个数M若可以写成以a开头的连续n个自然数之和,则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,(令%左边卫kn则m=(k+1)n+n*(n-1)/2)(k>=0),就和原来一样啦),即(M-(n*(n+1)/2))%n==0,这样就很容易判断一个数可不可以写成连续n个自然数的形式了,遍历n=2…sqrt(M)*2,(个人认为小于等于m/2+1或者sqrt(2*m)才是正解)还可以输出所有解。*/void divide(int num) { int i,j,a; for(i=2; i<=sqrt((float)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 0,M就可以写成以b-(a-1)/2开头的连续a个自然数;将这条结论里的a和b调换,仍然成立。15=3*5=1+2+3+4+5=4+5+6. 若b是偶数,则我们有一个奇数a和一个偶数b。 2.1 若b-(a-1)/2>0,M就可以写成以b-(a-1)/2开头的连续a个自然数。24=3*8=7+8+9. 2.2 若(a+1)/2-b>0,M就可以写成以(a+1)/2-b开头的连续2*b个自然数。38=19*2=8+9+10+11. 上述两个不等式必然至少有一个成立,所以可以证明,只要M有一个奇数因子,就一定可以写成连续n个自然数之和。另一个正整数分解的算法:sum(i,j)为i累加到j的和 令 i=1 j=2 if sum(i,j)>N i++ else if sum(i,j)using namespace std; int add(int m,int n) { int sum=0; for(int i=m;i<=n;i++) sum+=i; return sum; } void divide(int num) { int i=1,j=2,flag; int sum=0; while(i<=num/2) { sum=add(i,j); while(sum!=num) //一定存在解,所以不会死循环 { if(sum>num) i++; else j++; sum=add(i,j); } for(int k=i;k<=j;k++) cout< <<" "; ++i; cout< >num; divide(num); return 0; }