您的位置:首页 > 职场人生

一个数拆分成连续自然数的和(只考加法的面试题)

2013-07-02 18:43 183 查看
原地址:/article/8932208.html

题目:给定一个自然数,如何将它拆分成几个连续的自然数的和的形式,例如:9 = 4 + 5,12 = 3 + 4 + 5等,有哪些数不能分解成这样的形式,例如4,8等

分析:通过上面的几个例子可以发现一下规律:

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恰好不含有奇数的因子,因此不能被拆分。

参考文献

编程之美2.21
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐