亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: loveguohuasai
打印 上一主題 下一主題

[算法] 母牛數(shù)量算法 [復制鏈接]

論壇徽章:
0
21 [報告]
發(fā)表于 2003-08-04 08:48 |只看該作者

母牛數(shù)量算法

不知道是不是我想的太簡單了,大家看看我的(程序來不急寫了)

A:分為5類: 1。生的生牛 2。一年生牛 3。2年生牛,4。3年生牛 5多產的牛(一年生一頭^_^)
B:每過一年 1->;2 ,2->;3, 3->;4, 5=5+3; 1=5+3;(牛長大一歲,第5類生出小牛)
c:循環(huán)b直到n, 牛的總數(shù)就是1+2+3+4+5

論壇徽章:
0
22 [報告]
發(fā)表于 2003-08-04 13:03 |只看該作者

母牛數(shù)量算法

原帖由 "小飛愛使申華" 發(fā)表:


可你這也是遞歸啊!只要自己調自己就算了。
   

我覺得一定是要遞歸的,不用遞歸的話我覺得很難。

論壇徽章:
0
23 [報告]
發(fā)表于 2003-08-04 15:06 |只看該作者

母牛數(shù)量算法

我簡單寫了個遞歸算法,不知可以么?

我是按牛第四年開始生的,即第四年應該有5頭牛,改了一下,應該沒什么問題了!

  1.    
  2. long fun(int n){
  3. if (n>;3)
  4.    return fun(n-1)+fun(n-3);
  5. else if(n==3)
  6.    return 1;
  7. else if(n==2)
  8.    return 1;
  9. else if(n=1)
  10.    return 1;
  11. }
  12. main (){
  13. int n;
  14. printf("input n");
  15. scanf("%d",&n);
  16. printf("the result:%ld",fun(n));
  17. }
復制代碼

論壇徽章:
0
24 [報告]
發(fā)表于 2003-08-04 15:30 |只看該作者

母牛數(shù)量算法

非遞歸算法:

  1. long fun(int n){
  2. long a1=1;
  3. long a2=1;
  4. long a3=1;
  5. long a4=1;
  6. int i=0;
  7. long sum=0;
  8. for (i=4;i<n+1;i++){
  9.    a4=a1+a3;
  10.    a1=a2;a2=a3;a3=a4;
  11. }
  12. sum=a4;
  13.    return sum;
  14. }
  15. main (){
  16. int n;
  17. printf("input n");
  18. scanf("%d",&n);
  19. printf("the result:%ld",fun(n));
  20. }
復制代碼

論壇徽章:
0
25 [報告]
發(fā)表于 2003-08-04 16:05 |只看該作者

母牛數(shù)量算法

我的非遞歸算法,不過不是能帶參數(shù)的,如果想帶參數(shù)也可以
那就要用鏈表了,但是算法是一樣的,存儲方式不同而已。



  1. main (){
  2.         unsigned long year[100] ;//每年出生的牛數(shù)量
  3.         unsigned long ulResult ;
  4.         unsigned long sum ;//每年的育齡母牛數(shù)量
  5.         int i,j ;
  6.        
  7.         sum = 0 ;
  8.         for (i = 0; i < 100; i ++){
  9.                 if (i == 0){
  10.                         year[i] = 1 ;
  11.                         continue ;
  12.                 }
  13.                 if (i - 3 < 0){
  14.                         year[i] = 0 ;
  15.                 }else{
  16.                         for (j = 0; j <= i -3; j ++)
  17.                                 sum += year[j] ;
  18.                         year[i] = sum;
  19.                         sum = 0 ;
  20.                 }
  21.         }
  22.        
  23.         for (i = 0; i < 100; i ++)
  24.                 ulResult += year[i] ;
  25.        
  26.         printf ("ulResult = [%lu]", ulResult) ;
  27. }
復制代碼

最后結果是234467045
是100年的,用了不到1秒時間,呵呵

論壇徽章:
0
26 [報告]
發(fā)表于 2003-08-04 16:12 |只看該作者

母牛數(shù)量算法

還可以優(yōu)化一下

  1. main (){
  2.         unsigned long year[100] ;
  3.         unsigned long ulResult ;
  4.         unsigned long sum ;
  5.         int i,j ;
  6.        
  7.         sum = 0 ;
  8.                 year[0] = 1 ;
  9.                 year[1] = 0 ;
  10.                 year[2] = 0 ;  
  11.         for (i = 3; i < 100; i ++){
  12.                 sum += year[i - 3] ;
  13.                 year[i] = sum ;
  14.         }
  15.        
  16.         for (i = 0; i < 100; i ++)
  17.                 ulResult += year[i] ;
  18.        
  19.         printf ("ulResult = [%lu]", ulResult) ;
  20. }
復制代碼
   

復雜度只有2n

論壇徽章:
0
27 [報告]
發(fā)表于 2003-08-04 20:09 |只看該作者

母牛數(shù)量算法

好像結果有問題吧,不到100年數(shù)值早溢出了,不相信算算60年的數(shù)量比100年的多:3,808,901,426 >;234,467,045

論壇徽章:
1
榮譽版主
日期:2011-11-23 16:44:17
28 [報告]
發(fā)表于 2003-08-04 21:53 |只看該作者

母牛數(shù)量算法

我的遞歸算法:
  1. #include <stdio.h>;

  2. int inc(int);

  3. int fun(int n){                        /*計算第n年有多少牛的函數(shù)。*/
  4.         if ( n==1 ) return 1;
  5.         return inc(n)+fun(n-1);
  6. }

  7. int inc(int n){                        /*計算第n年牛的增長率的函數(shù)*/
  8.         if ( n<5 )                return 0;
  9.         else if ( n==5 )        return 1; /*滿4周歲的時候開始生小牛,即第5年的增長率為1。*/
  10.         else                         return inc(n-1)+inc(n-4);
  11. }

  12. int main(){
  13.         int n;
  14.         printf("\ninput n:");
  15.         scanf("%d",&n);
  16.         printf("result:%d\n",fun(n));
  17. }

復制代碼


我的非遞歸算法:

  1. #include <stdio.h>;


  2. long int fun(int n){
  3.         long int i_born=0;        /*滿1周歲的牛的數(shù)目,下面的類似*/
  4.         long int ii_born=0;
  5.         long int iii_born=0;
  6.         long int iv_born=0;
  7.         long int can_born=0;        /*今年能生產的牛的數(shù)目*/
  8.         long int sum=1;                /*總數(shù)*/
  9.         int i;
  10.         for (i=0;i<n;i++) {
  11.                 can_born+=iv_born;
  12.                 sum+=can_born;
  13.                 iv_born=iii_born;
  14.                 iii_born=ii_born;
  15.                 ii_born=i_born;
  16.                 i_born=can_born;
  17.                 if (!i) i_born=1;/*第一年的時候有1頭牛滿一歲*/
  18.         }
  19.         return sum;
  20. }

  21. int main(){
  22.         int n;
  23.         printf("\ninput n:");
  24.         scanf("%d",&n);
  25.         printf("result:%ld\n",fun(n));
  26. }

復制代碼

目前有兩種理解,3周歲開始生小牛和4周歲開始生小牛,姑且都算對的話。

“小飛愛使申華”的做法是對的,很巧妙的只用了一個遞歸就完成了,他的做法是3周歲開始生小牛。

loveguohuasai的做法是錯誤的,牛的數(shù)目不是等差的增長的,他的增長數(shù)率越來越快,其實它的增長速率的增長率也是越來越快的,如果把這些值看成是連續(xù)的,應該是一個無限階可導的函數(shù),并不是等差的。用筆算,把總數(shù)和增長率都列出來,算到15年左右就能看出來了。

還有“小飛愛使申華”對loveguohuasai的疑問,我覺得算是遞歸啊,一種間接遞歸,怎么不算遞歸呢?

stuff990的想法是對的,是應該分出小于4歲的牛多大的各有多少,然后計算,這也正是我的非遞歸算法的思想。但是,如果仔細分析就會發(fā)現(xiàn),牛的總數(shù)并不是一個等差數(shù)列那樣簡單。

zlzj2010的做法里有一個致命的錯誤,并不是fun(n)=fun(n-1)+fun(n-3),是的確,fun(n-3)的牛在n年可以生牛了,但并不是僅僅這些?梢陨,fun(n-1)里也有很大一部分?梢栽诘趎年繼續(xù)生小牛啊,你的程序里把這一部分漏掉了。

unicorns的做法是正確的,他是以牛3周歲開始生小牛算的,但是計算100年的確有問題,正如li2002所說,因為年份大的時候每年增長的牛的數(shù)量大大超乎了想象,造成了數(shù)組的溢出,這一點把year數(shù)組打印出來就可以很容易看出來,有很多的負值。如果計算50年就不會造成溢出。我的非遞歸算法德的結果和unicorns的一樣,個人覺得這組結果就是正確的了。如下:(也包括了100年的錯誤結果,unsigned long int是系統(tǒng)給的最長的數(shù)據了,如果要計算準確的話得自己構造數(shù)據類型。麻煩了,沒做,如果遞歸的話,也應該是這個錯誤結果。雖然是錯誤的,也有一定的參考價值。)
3周歲開始生牛,50年:83316385,100年:234467045
4周歲開始生牛,50年:3951206, 100年:566194214
從兩個100年的結果也能看出來溢出的錯誤。

我的非遞歸程序的想法和stuff990的想法是類似的,我是以4周歲開始生小牛為準,用了4個變量統(tǒng)計各個時期小于4周歲(不可生育牛)的數(shù)量,來計算每年可生育牛的數(shù)量和牛的總數(shù)的。

而公式,我覺得如果以4周歲開始生小牛為準的話(3周歲開始的可以類推,程序也很好改),應該是:
f(n)=f(n-1)+inc(n);                /*去年牛的數(shù)量,和今年增長的牛的數(shù)量的和*/
inc(n)=inc(n-1)+inc(n-4);        /*去年增長的數(shù)量(生這些牛的牛今年還可以生),和新成熟的可以生牛的牛的數(shù)量(就是4年以前出生的牛)*/
我的非遞歸算法就是用這兩個公式做的,不過計算一個年份的時候要兩次陷入inc的遞歸,復雜度很高,效率很差。覺得“小飛愛使申華”的遞歸算法很好!盎疑壽E”的遞歸算法也很好,我就是在這個遞歸算法的啟示下寫出的我的非遞歸算法。

還有,就是大家貼上來的程序最好能多寫點注釋,方便閱讀和理解。

最后,感謝loveguohuasai提出這么好的問題,也非常榮幸能在這里和大家這么高興的討論問題,言辭之中有得罪的地方還請見諒。

論壇徽章:
0
29 [報告]
發(fā)表于 2003-08-04 22:24 |只看該作者

母牛數(shù)量算法

aero老兄不錯,碼了不少字,分析得也很有理,好!
我還正愁這么一大堆code,也不知對錯,很容易誤人子弟的,現(xiàn)在好了,有人出來評判一下,再次感謝。
PS:我對loveguohuasai的疑問,其實是想說這也是一種遞歸,后來發(fā)現(xiàn)表達得有歧意,立馬在樓下又加了一句,呵呵。

論壇徽章:
0
30 [報告]
發(fā)表于 2003-08-05 02:48 |只看該作者

母牛數(shù)量算法

原帖由 "aero" 發(fā)表:
目前有兩種理解,3周歲開始生小牛和4周歲開始生小牛,姑且都算對的話。

“小飛愛使申華”的做法是對的,很巧妙的只用了一個遞歸就完成了,他的做法是3周歲開始生小牛。

loveguohuasai的做法是錯誤的,牛的數(shù)目..........
   

我想問一下,我知道第一種我是想錯了的,第二種也錯嗎?我覺得不可能錯,其實就是一句話可以把它解釋清楚:今年的數(shù)量是去年的數(shù)量加上四年前(就是f(n-3))的數(shù)量(因為四年前的牛在今年開始生牛,知道這個算法不是很簡單嗎?就是要用到遞歸。我覺得這樣的算法絕對是最簡單的了。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP