一个数拆分成连续自然数的和(只考加法的面试题)
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
题目:给定一个自然数,如何将它拆分成几个连续的自然数的和的形式,例如: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
相关文章推荐
- 一个数拆分成连续自然数的和(只考加法的面试题)
- 只考加法的面试题——将一个正整数表示成连续的自然数序列之和
- 递归算法(求n的加法组合,将一个整数拆分成多个整数相加的形式, O(N)时间,O(N)空间)
- 递归算法(求n的加法组合,将一个整数拆分成多个整数相加的形式, O(N)时间,O(N)空间)4.0版
- 那天在CSDN上看到一个网友在华为遇到的面试题是一道乘法题看似简其实并不是因为它们都超出了数据类型的范围,今天做了下加法希望对大家有所启示
- NOJ [1356] Hey! Where Is My Sweets(╯▔皿▔)╯ 一个数拆分成最多m个数的不重复的方法数
- 一个百度面试题“找珠子”的实现算法
- 面试题15:输入一个链表,输出该链表中倒数第k个结点。
- 面试题─用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列
- 一道有趣的GOOGLE面试题——找出至少一个重复元素
- 面试题:GPS定位一个点,至少需要几个卫星?
- 谷歌面试题--一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间
- 《招聘一个靠谱的iOS》面试题参考答案(下)
- [每日练习]面试题--将一个有序数组转化为二叉排序树
- 笔试题&面试题:设计一个复杂度为n的算法找到单向链表倒数第m个元素
- 将一个正整数n,拆分成连续的自然数之和,输出所有可能的情况
- 陈皓:一个 fork 的面试题
- sql server中将一个字段根据某个字符拆分成多个字段显示
- 一个让人爱恨交织的java面试题
- 一个腾讯的面试题