關於骰子的一道演算法題 期望 求和 錯位相減

2021-06-17 17:58:01 字數 4023 閱讀 6228

海爺和我share了乙個很有意思的演算法題:

from:

乙個骰子,6面,1個面是 1, 2個面是2, 3個面是3, 問平均擲多少次能使1,2,3都至少出現一次!

首先要知道這個題求什麼,最先直接沒理解

這題可以翻譯為,乙個骰子,6面,1個面是 1, 2個面是2, 3個面是3,隨機扔骰子,在第x次時3個數都出現,求這個x的期望(也就是扔無數次,x的平均值是多少)

思路:第一二次肯定不可能出現這種情況

第x(x > 2)次三個都出現的情況分三種(x ^ y 表示 x 的 y 次方)

1:第x次出現 1,那麼前面出現的必然是 2 和 3 ,且至少出現一次

出現1的概率為 1 / 6,前面x-1次不出現1的概率為(1 - 1 / 6) ^ (x - 1),

但是其中包含全是 2 和全是 3 的情況,去掉全 2 的概率 (1 / 2) ^ (x - 1),全部為3的概率(1 / 3) ^ (x - 1),

那麼情況 1 的概率為 ((1 - 1 / 6) ^ (x - 1) - (1 / 2) ^ (x - 1) - (1 / 3) ^ (x - 1)) * (1 / 6)

2:第x次出現2,那麼前面出現的必然是 1 和 3 ,且至少出現一次 同樣,概率為 ((1 - 1 / 3) ^ (x - 1) - (1 / 2) ^ (x - 1) - (1 / 6) ^ (x - 1)) * (1 / 3)

3:第x次出現3,那麼前面出現的必然是 1 和 2 ,且至少出現一次 同樣,概率為 ((1 - 1 / 2) ^ (x - 1) - (1 / 3) ^ (x - 1) - (1 / 6) ^ (x - 1)) * (1 / 2)

p(x)就為上面三種情況的和

那麼,根據期望公式,平均值就等於從x = 3 到 n(無窮)求(x * p(x))的和

利用錯位相減法計算極限值,附**

#include "stdio.h" 

#include "math.h"

const int max_try = 10000;

double funbase(double x)

double funone(double x)//每種情況的極限

double funthree(double x1, double x2, double x3)

double funtimebase(double x, int n)

double funtimeone(double x1, double x2, double x3, int n)

double funtimeall(double x1, double x2, double x3, int start, int n)

return total;

}double fundirectone(double x1, double x2, double x3, int n)

double fundirectall(double x1, double x2, double x3, int start, int n)

return total;

}int main()

先把我的執行結果發出來:

錯位相減法是一種常用的

數列求和

方法,應用於

等比數列

與等差數列

相乘的形式。 形如an=bncn,其中bn為

等差數列

,cn為

等比數列

;分別列出sn,再把所有式子同時乘以等比數列的

公比,即ksn;然後錯一位,兩式相減即可。

如果數列的各項是由乙個

等差數列

和乙個等比數列

的對應項之積構成的,那麼這個數列的前n項和可用此法來求,如等比數列的前n項和公式就是用此法推導的

例如:求和sn=1+3x+5x^2+7x^3+…+(2n-1)*x^(n-1)(x≠0)

當x=1時,sn=1+3+5+…+(2n-1)=n^2;

當x不等於1時,sn=1+3x+5x^2+7x^3+…+(2n-1)*x^(n-1);

∴xsn=x+3x^2+5x^3+7x^4+…+(2n-1)*x^n;

兩式相減得(1-x)sn=1+2[x+x^2+x^3+x^4+…+x^(n-1)]-(2n-1)*x^n;

化簡得sn=1/1-x+(2x-2x^n)/(1-x)^2-(2n-1)*x^n/1-x

錯位相減法是求和的一種解題方法。在題目的型別中:一般是a前面的係數和a的指數是相等的情況下才可以用。

這是例子:

s=a+2a^2+3a^3+……+(n-2)a^(n-2)+(n-1)a^(n-1)+na^n (1)

在(1)的左右兩邊同時乘上a。 得到等式(2)如下:

as= a^2+2a^3+3a^4+……+(n-2)a^(n-1)+(n-1)a^n+na^(n+1) (2)

用(1)—(2),得到等式(3)如下:

(1-a)s=a+(2-1)a^2+(3-2)a^3+……+(n-n+1)a^n-na^(n+1) (3)

(1-a)s=a+a^2+a^3+……+a^(n-1)+a^n-na^(n+1)

s=a+a^2+a^3+……+a^(n-1)+a^n用這個的求和公式。

(1-a)s=a+a^2+a^3+……+a^(n-1)+a^n-na^(n+1)

最後在等式兩邊同時除以(1-a),就可以得到s的通用公式了。

例子:求和sn=3x+5x^2+7x^3+……..+(2n-1)·x的n-1次方(x不等於0)

解:當x=1時,sn=1+3+5+…..+(2n-1)=n^2;;

當x不等於1時,sn=3x+5x^2+7x^3+……..+(2n-1)·x的n-1次方

所以xsn=x+3x^2+5x^3+7x四次方……..+(2n-1)·x的n次方

所以兩式相減的(1-x)sn=1+2x(1+x+x^2+x^3+...+x的n-2次方)-(2n-1)·x的n次方。

化簡得:sn=(2n-1)·x地n+1次方-(2n+1)·x的n次方+(1+x)/(1-x)平方

cn=(2n+1)*2^n

sn=3*2+5*4+7*8+...+(2n+1)*2^n

2sn=3*4+5*8+7*16+...+(2n-1)*2^n+(2n+1)*2^(n+1)

兩式相減得

-sn=6+2*4+2*8+2*16+...+2*2^n-(2n+1)*2^(n+1)

=6+2*(4+8+16+...+2^n)-(2n+1)*2^(n+1)

=6+2^(n+2)-8-(2n+1)*2^(n+1) (等比數列求和)

=(1-2n)*2^(n+1)-2

所以sn=(2n-1)*2^(n+1)+2

錯位相減法

這個在求等比數列求和公式時就用了

sn= 1/2+1/4+1/8+....+1/2^n

兩邊同時乘以1/2

1/2sn= 1/4+1/8+....+1/2^n+1/2^(n+1)(注意跟原式的位置的不同,這樣寫看的更清楚些)

兩式相減

1/2sn=1/2-1/2^(n+1)

sn=1-1/2^n

例題1已知等比數列an中,a1=3,點(an,an+1(角碼,

後不解釋))在直線y=x+2上

①求數列an的通項公式

②若bn=an×3的n次方,求數列前n項和tn

解:①點(an,an+1)在直線y=x+2上,an+1=an+2(2為常數)

即an+1-an=2.所以an是以3為首項,2為公差的等差數列

②bn=an×3的n次方,bn=(2n+1)×3的n次方

tn=3×3+5×3²+7×3³+…+(2n-1)×3的n-1次方+(2n+1)×3的n次方……一

3tn=3×3²+5×3³+…+(2n-1)×3的n次方+(2n+1)×3的n+1次方……二

一減二得 9+2×(9(1-3的n-1次方)\1-3)-(2n+1)×3的n+1次方=-2n×3的n+1次方

所以tn=n×3的n+1次方

故得出結果。

一道容易錯的題

請問下面的 的列印結果是什麼?為什麼?var b 10 function b 是10?還是20?其實都不是 我們知道作用域的函式宣告提公升和變數宣告提公升,但是這裡的 function b 是函式表示式,不是函式宣告。函式表示式與函式宣告不同,它的函式名只在函式內部有效,並且此繫結屬於常量繫結。在 ...

一道關於排序的演算法題

題目 給定乙個無序陣列a,一直這個陣列a中的任意乙個元素所在的位置離其最終排序後的位置相差的距離不會超過k。即排序前a i 在位置i,那麼在排序後該元素的位置會在 i k,i k 這個範圍內。現在要求給出乙個演算法使得演算法盡量高校。解析 這裡就不多說了,直接給自己的解法吧。利用乙個大小為k 1的最...

一道演算法題

兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...