由簡單小問題引發的思考和推理

2021-07-10 21:13:05 字數 1993 閱讀 4830

財迷有多少錢?

有乙個財迷總想使自己的錢成倍增長,一天他在一座橋上碰見了乙個老人,老人說:」你只要走過這座橋再回來,你身上的錢就會增加一倍,但你每走乙個來回要給我32個銅板。「財迷覺得合算,就同意了。他走過橋又走回來,身上的錢果然增加了一倍,他高興地給了老人32個銅板。這樣走完第五個來回,財迷身上最後的32個銅板都給了老人,乙個也沒剩。財迷身上原來有多少個銅板?

第5次走完以後 0 走之前(0 + 32 )/2 = 16

第4次走完以後 16 走之前(16 + 32 )/2 = 24

第3次走完以後 24 走之前(24 + 32 )/2 = 28

第2次走完以後 28 走之前(28 + 32 )/2 = 30

第1次走完以後 30 走之前(30 + 32 )/2 = 31

這種方式是一眼就能得出的方法,寫成程式也很簡單:

int f(int x) //輸入走之後有多少錢計算走之前有多少錢

int main()

cout << "原來有 " << x << " 個銅板" << endl;

system("pause"):

return 0;

}

但是,慢著,這邊出現了迴圈....而且迴圈裡面只是乙個式子,那麼我們能不能給他抽象成乙個通項公式呢?

是可以的!

我們將次數抽象出來,n次以後用完銅板,那麼

n == 1 :

a0 * 2 - 32 = 0     //a0 代表進入第1次時候的初始銅板

a0 = 32 / 2

n == 2 :

a1 * 2 - 32 = 0  

a0 * 2 - 32 = a1

結合上面兩個式子 : (a0 * 2 - 32) * 2 - 32 = 0   =>  a0 = 32/2 + 32/4

n == 3:

a2 * 2 - 32 = 0  

a1 * 2 - 32 = a2

a0 * 2 - 32 = a1

結合上面三個式子 : ((a0 * 2 - 32) * 2 - 32 ) * 2 - 32 = 0   =>  a0 = 32/2 + 32/4 + 32/8

...現在 上面似乎有了規律:

若n次以後用完銅板

a0 = 32/(2^1)+ 32/(2^2) + 32/(2^3) ... 32/(2^n)

進一步化簡為 

a0 = 32*(1/(2^1)+ 1/(2^2) + 1/(2^3) ... 1/(2^n))

進一步化簡為 

a0 = 32*( (2^(n-1) +2^(n-2) + ... + 2^(n-n)) / 2^n )

進一步化簡為 

a0 = 32*( 2^n - 1/ 2^n )

嘿嘿,這樣就出來了乙個簡單的通項公式可以很方便的求出初始有多少錢了!再把每次要付的錢設定為x 則為:

a0 = x*( 2^n - 1/ 2^n ) // a0為初始有多少銅板,x為每次付的錢, n為多少次以後用光所有錢

具體寫成**如下:

int f(int n, int x)

int main()

執行結果如下:

PHP 由一些小問題引發的思考

判斷陣列是否為空 stl容器裡面可以利用empty,count等方法去判斷是否含有元素 std vector ivec if ivec.count 0 ivec.empty 基本的內建型別陣列 可以結合sizeof來判斷。當然如果是陣列的話,就不應該為空,int a 0 編譯器會報錯。如果我們想判斷...

由 引發的思考

前陣子在乙個移動專案中,通過 的方式 繫結click 事件來提交乙個表單,由於表單資訊比較敏感,於是採用的post 同步提交的方式,原本到也沒有什麼。後來萬惡的pm說 你這個按鈕呀,要固定在底部比較好 於是乎就通過 position fixed 固定到底部了。那麼,問題來了 在ios 下,虛擬鍵盤是...

由XML Literal引發的思考

首先,什麼是xml literal呢?原來,這是在vb.net 9.0才引入的乙個用於構建xml物件的新特性,並且只有vb.net 9.0才支援。我們都知道,要建立xml樹,可以使用linq中的api,如下所示 出自vb.net 9.0 xml literal dim xml2 new xeleme...