題目:.
我們知道:1+2=3;
4+5=9;
2+3+4=9;
等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這種形式呢?
.問題1. 寫乙個程式,對於乙個64位正整數,輸出它所有可能的連續自然數(兩個以上)之和的算式; .
問題2. 有的數例如32就找不到這樣的表達,這樣的數字有什麼規律? .
問題3. 在64位正整數中,子串行數目最多的是哪乙個?能否用數學知識推導出來?.
ps: 64位整數為一種資料型別,即是pascal的int64以及c++的long long。能夠表達-9223372036854775808到9223372036854775807之間的任意整數。.
問題1:.
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
判斷條件: num%(k*(k-1)/2)==0 或者 2*num>k*(k-1) 得: k
#include
using namespace std;
void addnum(__int64 num)
else
if (((num-j)%k)==0)
if (flag==1)
} flag=0;
cout
else
} if (flag==-1)
}
void main()
第二題:.
解題思路:.
因為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的因式分解中必須含有乙個奇數才可以表達成連續自然數相加的形式。.
反證法:.
如果num的因式分解中不含有奇數。設num= a * b .並且a 、b為偶數。.
設a=(2*i +k-1) ,b=k/2. 因為b為偶數,所以k為偶數。得出k-1為奇數。即(2*i +k-1)為奇數。這與a是偶數矛盾。.
設a=(2*i +k-1) /2,b=k. 因為a為偶數,所以(2*i +k-1)為偶數。得出k-1為偶數。即k為奇數。這與b是偶數矛盾。.
. 從程式輸出結果上來看:.
由此推理得:這些數都是2的n次方。只要是2的n次方就不能轉化成各個自然數連續相加的情形。
第三題.
解題思路:.
8位數中子序列最大的數是:(22個子序列)253 = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17+ 18 + 19 + 20 + 21 + 22.
16位數中子序列最大的數是:(361個子序列)65341 = 1 + 2 + 3 + 。。。。+ 358 + 359 + 360 + 361
。。。。。
設64位數中最大的子串行數字x。有k個子序列。
則x=1+2+3+。。。。+k=k*(1+k)/2
8位數:k*(k+1)/2 <0xff 得到方程: k^2 + k -512 < 0 ,解方程得 k <22.13. 取k=22. 從1+2+。。。+22就可以得到想要得到的數。
對於64位的數。同樣利用上面的方程:k*(k+1)/2 <0xffffffffffffffff 得到方程: k^2 + k - (2*0xffffffffffffffff) < 0.
解方程得到: k <=6074000999 則num= 18446744070963499500
程式設計之美2 21 只考加法的面試題
問題1 寫乙個程式,對於乙個數,輸出他所有可能的連續自然數之和的算式。解 num a a 1 a 2 a 3 a k 2 a k 1 k a a k 1 2 ka k k 1 2 k是整數,a是整數,所以k k 1 2也是整數。include using namespace std void que...
程式設計之美2 21 只考加法的面試題
問題描述 寫乙個程式,對於乙個64位正整數,輸出它所有可能的連續自然數 兩個以上 之和的算式。例如 3 1 2 9 5 4 9 2 3 4。剛開始看到這個題目,直接想到的方法就是蠻力解決 即對於每乙個輸入的整數,從1開始加,一直加到等於或者大於這個整數為止。如果等於這個整數,則找到了一種連續自然數相...
只考加法 程式設計之美2 21
我們知道 1 2 3 4 5 9 2 3 4 9 等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這種形式呢?寫乙個程式,對於乙個32位正整數,輸出它所有的連續自然數之和的算式。可以發現任意自然數序列其實是公差為1的等差數列,那麼數列前n項和公式有a1 n n n 1 2 sn,...