如:15=7+8 ;15=4+5+6;15=1+2+3+4+5;
第一个数取x, 可以取n个数,和为N, 即(x-1)n + (1+n)n/2 = N
可以得:x = (2N+n-n*n)/2;
int n = 15;
for (int i = 2; i < (n+1) / 2; i++) {
int i1 = 2 * n - i * i + i;
if (i1 % (2*i) == 0) {
int a1 = i1 / (2*i);
if (a1 > 0) {
for (int j = 0; j < i; j++) {
System.out.print((a1 + j) + " ");
}
System.out.println();
}
}
}
// 7 8
//4 5 6
//1 2 3 4 5
如果只为获取是不是达成这个结果--一个数可以为多个连续自然数的和
分析:通过上面的几个例子可以发现一下规律:
1)所有的奇数n都可以分解成(n/2) + (n/2 +1)
2)偶数有点麻烦,先对部分例子进行计算,比如6 = 1 + 2 + 3,10 = 1 + 2 + 3 + 4, 12 = 3 + 4 + 5, 30 = 9 + 10 + 11 = 4 + 5 + 6 + 7 + 8,我们发现如果n能够被一个奇数整除,例如12/3 = 4,12可以被3整除,那么构造方案就可以以商为中心向两边扩展,每次过看都增加2个数,而这两个数的和/2刚好为商,这样就可以有奇数个商相乘,刚好等于被除数,这是一种构建方法。但这种方法有时会有问题,比如10,它可以被奇数5整除,但按照上面的构建策略会有问题,经过分析发现,上面构造的方法,结果一定是奇数个数相加,而10的构建是偶数个数相加。对于这类数,我们如何处理呢?经过举例归纳我们发现,如果一个数被2整除后商是奇数,那么可以这样来构建,因为两个这样的奇数加起来可以得到n,而奇数的构建可以通过(n/2) + (n/2 +1)来构建起来,那么我们知道数列((n/2) -1 ) 与(n/2+1) +1 的和等于(n/2) + (n/2 +1),而这4个数都是连续的。经过上面的分析,我们可以构建所有n/2为奇数的情况,以及n可以被某个奇数整除的情况,但我们一直不能处理n不能被某个奇数整除的情况,事实上这种数如2,4,8, 16,...,2^n是不能拆分的,下面来证明为什么会这样。
3)证明2^n不能拆分成题目要求的形式,我们可以相像,拆分后的数字个数要么为奇数个要么为偶数个。
先看拆分为奇数个数的情况,假设拆分成a[1]+ a[2]+ ...+ a[j]其中j为奇数,那么(a[1]+a[j]) = (a[2]+a[j-1])=...= a[(1+j)/2],这些数相加刚好等于((1+j) +1) *a[(1+j)/2]因为j位奇数,j+2也为奇数,也就是说n有一个奇数的因子;
再看拆分为偶数个数的情况,假设拆分成a[1]+ a[2]+ ...+ a[j]其中j为偶数,那么(a[1]+a[j]) = (a[2]+a[j-1])=...= (a[j/2] + a[j/2+1]),这些数相加的和等于(j/2)*(a[j/2] + a[j/2+1]),我们知道(a[j/2] + a[j/2+1])是相邻的自然数,必定一个为奇数一个为偶数,所以(a[j/2] + a[j/2+1])必定为奇数,也就是说n有一个奇数的因子;
这两种情况都证明了n如果能够被拆分,一定含有一个奇数的因子,而2^n恰好不含有奇数的因子,因此不能被拆分。
————————————————
版权声明:本文为CSDN博主「bertzhang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bertzhang/article/details/7266649
直接判断n是否可以为多个连续自然数的和,只需要判断是不是2^n即可,数字满足m=2^n,则
(m&(m-1))==0
if ((n&(n-1)) == 0) {
System.out.println("NO");
} else {
System.out.println("Yes");
}