设计一个算法,判断一个integer n是不是可以表示成k(k>=2)个连续正整数的和# JobHunting - 待字闺中l*y2010-11-06 07:111 楼设计一个算法,判断一个integer n是不是可以表示成k(k>=2)个连续正整数的和比如:9=4+5 或者9=2+3+4, 但是8就不可以奇数都可以,但是偶数怎么判断?
E*a2010-11-06 07:112 楼这还要“算法”? 所有非2^n的数都可以【在 l********y 的大作中提到】: 设计一个算法,判断一个integer n是不是可以表示成k(k>=2)个连续正整数的和: 比如:9=4+5 或者9=2+3+4, 但是8就不可以: 奇数都可以,但是偶数怎么判断?
m*n2010-11-06 07:114 楼10=1+2+3+4任何一个数sum,如果 sum/奇数=整数,那么可以;如果 sum/偶数=整数+0.5,也是可以。除此以外都不行。【在 l********y 的大作中提到】: 设计一个算法,判断一个integer n是不是可以表示成k(k>=2)个连续正整数的和: 比如:9=4+5 或者9=2+3+4, 但是8就不可以: 奇数都可以,但是偶数怎么判断?
d*t2010-11-06 07:115 楼设一个数n是从a开始k个连续正整数的和,有n = (a+a+k-1)/2*k = (2a+k-1)*k/2i.e. 2*n = (2a+k-1)*k不管k是奇是偶,(2a+k-1)*k 都是一个奇数*偶数,所以n不能是2^m
m*n2010-11-06 07:117 楼你只证明2^m 不可能是k个数相加没证明非2^m就一定是k个数相加【在 d*****t 的大作中提到】: 设一个数n是从a开始k个连续正整数的和,有: n = (a+a+k-1)/2*k = (2a+k-1)*k/2: i.e. 2*n = (2a+k-1)*k: 不管k是奇是偶,(2a+k-1)*k 都是一个奇数*偶数,所以n不能是2^m
s*e2010-11-06 07:118 楼我一开始是想写成这样for(i=2;i<=n/2;i=i*2){if( n%i == i/2 && n/i-i/2>=1)return true;}for(i=3;i<=n/3;i=i+2){if( n%i == 0 && n/i-(i-1)/2>=1)return true;}return false;感觉2^m的方法是正解。上面用code的方法不知道能不能帮助证明为什么只要不是2^m就行?btw有没有谁可以检查下这个code有无漏洞?
D*h2010-11-06 07:119 楼n为奇数,n = (n-1)/2+ (n+1)/2n为偶数, 已经证明n = 2^s (s>0) 不能假设 n = 2^s * (2t+1) (s>0, t>0)n= (1+2+...+m)-(1+2+...+k)=(m-k)(m+k+1)/2令 m-k = 2^(s+1)m+k+1 = 2t+1可以得到 m = 2^s +tk = -2^s +t如果k<0m+k+1 = 2^(s+1)m-k = 2t+1得到m = 2^s+tk = 2^s-t-1总是有解。所以除了2^s以外的所有大于2得数都是可以的.【在 m******n 的大作中提到】: 你只证明2^m 不可能是k个数相加: 没证明非2^m就一定是k个数相加
D*h2010-11-06 07:1110 楼见我上面的证明【在 s*******e 的大作中提到】: 我一开始是想写成这样: for(i=2;i<=n/2;i=i*2): {: if( n%i == i/2 && n/i-i/2>=1): return true;: }: for(i=3;i<=n/3;i=i+2): {: if( n%i == 0 && n/i-(i-1)/2>=1): return true;