同學的同學問了這樣乙個問題:
有一對小老鼠,出生一周後長成一對大老鼠,兩周後這對老鼠生出第一對小老鼠,三周後上週出生的小老鼠變成大老鼠,而原來的大老鼠又生出了一對小老鼠之後便死了,四周後,第一對出生的小老鼠(此時已經是大老鼠)又生出了一對小老鼠,此時共有三對老鼠。程式設計,計算n週後有多少對老鼠?
首先,這個問題如果小鼠沒有死亡,就是乙個典型的斐波那契數列(事實上斐波那契數列最早就是描述兔子繁殖的)
加上死亡,就需要重新考慮一下了~
方法一:
自然是超級水的同時很管用的----找規律法。
週數 0-----1-----2-----3-----4-----5-----6-----7.............
鼠數 1-----1-----2-----2-----3-----4-----5-----7.............
很容易就發現,相鄰兩個的和是隔一周的數,比如:2周和3周的和是5周,4周和5周的和是7周。
所以遞迴之:
1 #include 23using
namespace
std;45
int mouse(intn)6
11else
if (1 ==n)
1215
else
if (2 ==n)
1619
else
2023}24
25int
main()
2633
34return0;
35 }
方法二:
遞迴太慢了,而且對於這個問題,顯然沒複雜到只能用遞迴。
第二個方法就是手動模擬整個繁殖過程,開個陣列存不同年齡段的老鼠。也就是改成用遞推做~
1 #include 23using
namespace
std;45
int num(int);6
7int
main()814
1516
return0;
17}1819
int num(int
n)20;22
intt1, t2;
2324
for (int i=0; ii)
2534
return (a[0]+a[1]+a[2
]);35 }
又有下文了,同學的同學的老師說要大數也能處理的。
補充乙個:
1 #include 2 #include 34const
int max = 100000;5
6using
namespace
std;78
void add(char *str1, char *str2, char *str3);
9void num(int, char *);
1011
intmain()
1221
2223
return0;
24}2526
void num(int n, char *s)
2747
char
temp1[max];
48char
temp2[max];
49char
te***[max];
50strcpy(temp1, a0);
51add(temp1, a1, temp2);
52add(temp2, a2, te***);
53strcpy(s, te***);54}
5556
void add(char *str1, char *str2, char *str3)
5773
while (i1 >= 0)74
79while (i2 >= 0)80
8586
if(carry)
8790 str3[j] = '\0'
;9192for (i=0, --j; ij)
9398 }
老鼠繁殖問題
問題 一對耗子每個月生一對小耗子,小耗子成長3個月,從第4個月開始也可以每個 月生一對小耗子。假如所有的耗子都不死的情況下,2年 24個月 後一共有多少只耗子?業務邏輯來看 將老鼠分為 old 出生超過3個月 first 出生乙個月 second 出生兩個月 third 出生3個月 如下 inclu...
老鼠毒藥問題
問題1 1000瓶水中有 1瓶下了毒,老鼠只要喝一點點就會在一周之內死掉,問至少需要多少只老鼠,才能在一周之內找出是哪一瓶水有毒?微軟筆試題 解析 假設有 n只老鼠,則瓶數的上限n 2 n 將瓶子的 10進製編號 0 n 1 改為n位的2進製碼,然後 從左到右 讓第1只老鼠喝所有 編號的2 進製碼中...
貓吃老鼠問題
今天在看雪看到這個 貓吃老鼠問題 的帖子,和當初學程式設計時的乙個叫做 約瑟夫環問題 類似。自己按照數學的方法分析了一下,得到乙個數學演算法。問題描述 現有n個老鼠圍成一圓圈,有乙隻貓從任意位置開始吃老鼠,每次都隔乙個老鼠吃,請給出最後乙個老鼠的編號?題目要求是任給老鼠數n,輸出貓最後吃的老鼠的編號...