2.21 只考加法的面试题
2.21 只考加法的面试题
基础问题
我们知道:1+2=3;4+5=9;2+3+4=9;
等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式呢?
1 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;
\(num=i + i+1 + i+2 + ....+ i+k-1\) 一共有k个数。
\(= (i + i+k-1)*k/2\)
\(=(2*i+k-1)*k/2\)
\(=k*(i+ (k-1)/2)\)
\(=k*i + k*(k-1)/2\)
Coding
class Solution {
public int consecutiveNumbersSum(int N) {
// 2N = k(2x + k + 1)
int ans = 0;
for (int k = 1; k <= 2*N; ++k)
if (2 * N % k == 0) {
int y = 2 * N / k - k - 1;
if (y % 2 == 0 && y >= 0)
ans++;
}
return ans;
}
}
2 有的数例如32就找不到这样的表达,这样的数字有什么规律?
因为\(num=(2*i+k-1)*k/2\)
接下来分析\((2*i + k-1)*k*(1/2)\)的特征。
\(2*i\)为偶数。若k为奇数,k-1为偶数。则\((2*i + k-1)*(1/2)\) 是一个整数。设为X。则\(num=k * X =奇数 * X .\)
\(2*i\)为偶数。若k为偶数,k-1为奇数。则\((2*i + k-1)\)为奇数。则 k*(1/2) 是一个整数。设为X。则\(num=(2*i + k-1) * X =奇数 * X .\)
由此可见,num的因式分解中必须含有一个奇数才可以表达成连续自然数相加的形式。
由此推理得:这些数都是2的n次方。只要是2的n次方就不能转化成各个自然数连续相加的情形。
(只要是2的n次方就不能转化成各个自然数连续相加的情形。 )
3 在64位正整数中,子序列数目最多的是哪一个?能否用数学知识推导出来?
子序列从1开始向后加可以形成最长的序列。设这个序列的和为X,则在64位正整数范围内,\(X<2^{64}-1\)
\[X=1+2+3+...+K = K*(K+1)/2<x^64-1
\]
解出\(k<=6074000999\) 则 \(num= 18446744070963499500\)
Saying Less Doing More