題目:我們知道: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
#includeusing第二題:namespace
std;
void
addnum(__int64 num)
else
if (((num-j)%k)==0
)
if (flag==1
)
}flag=0
; cout
<
}if ((k+1)%2==0
)
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 2 3 4 5 9 2 3 4 9 等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這種形式呢?問題1.寫乙個程式,對於乙個64位正整數,輸出它所有可能的連續自然數 兩個以上 之和的算式 問題2.有的數例如32就找不到這樣的表達,這樣的數字有什麼規律?問題3....
只考加法 程式設計之美2 21
我們知道 1 2 3 4 5 9 2 3 4 9 等式左邊都是兩個以上連續的自然數相加,那麼是不是所有的整數都可以寫成這種形式呢?寫乙個程式,對於乙個32位正整數,輸出它所有的連續自然數之和的算式。可以發現任意自然數序列其實是公差為1的等差數列,那麼數列前n項和公式有a1 n n n 1 2 sn,...
《程式設計之美》 2 21只考慮加法
我們知道 1 2 3 4 5 9 2 3 4 9。等式的左邊都是兩個或兩個以上連續的自然數相加,是不是所有的整數都可以寫成這樣的形式呢?問題1 對於乙個64位正整數,輸出它所有可能的連續自然數 兩個以上 之和的算式。問題2 大家在測試上面程式的過程中,肯定會注意到有一些數字不能表達為一系列連續的自然...