(百度算法题)有三种走楼梯方式,走完100阶总共有多少种走法

原题:

有一100阶层的楼梯,有三种走楼梯方式,一次走一阶,一次走两阶,一次走三阶。用算法实现,走完100阶总共有多少种走法

解答:

f(n)=f(n-1)+f(n-2)+f(n-3)

有两个要点:1,结果大于int32,需要用到高精度。 2,直接递归会有大量重复运算,需要缓存每一步的结果

 


  1. #include "stdio.h" 
  2.  
  3. void addCache(char count[], char d[]); 
  4. void reverse(int index); 
  5. void lastMove(int stepOver); 
  6.  
  7. char result[100]; 
  8. char cache[101][100]; 
  9.  
  10. void main() 
  11.     for (int i = 0; i < 101; i++) 
  12.     { 
  13.         cache[i][0] = 0; 
  14.         for (int j = 1; j < 100; j++) 
  15.         { 
  16.             cache[i][j] = 0; 
  17.         } 
  18.     } 
  19.     cache[0][0] = '0'
  20.     cache[1][0] = '1'
  21.     cache[2][0] = '2'
  22.     cache[3][0] = '4'
  23.  
  24.     int floor = 100; 
  25.     lastMove(floor); 
  26.  
  27.     reverse(floor); 
  28.     printf("total: %s", result); 
  29.  
  30. void lastMove(int stepOver) 
  31.     if (stepOver > 3) 
  32.     { 
  33.         for (int i = 1; i <= 3; i++) 
  34.         { 
  35.             int index = stepOver - i; 
  36.             if (cache[index][0] == 0)//not cached 
  37.             { 
  38.                 lastMove(index); 
  39.             } 
  40.             addCache(cache[stepOver], cache[index]); 
  41.         } 
  42.          
  43.     }  
  44.     else 
  45.     { 
  46.         printf("error\n"); 
  47.     } 
  48.  
  49. void addCache(char count[], char d[]) 
  50.     int j = 0; 
  51.     while (d[j] != 0) 
  52.     { 
  53.         int in = d[j] - '0'
  54.         for (int i = j; i < 100; i++) 
  55.         { 
  56.             if (in == 0) 
  57.             { 
  58.                 break
  59.             } 
  60.             if (count[i] == '\0'
  61.             { 
  62.                 count[i] = '0'
  63.             } 
  64.              
  65.             int curNum = count[i] - '0' + in; 
  66.             if (curNum > 9) 
  67.             { 
  68.                 in = curNum / 10; 
  69.                 curNum -= in * 10; 
  70.             } 
  71.             else 
  72.             { 
  73.                 in = 0; 
  74.             } 
  75.             count[i] = curNum + '0'
  76.         } 
  77.          
  78.         j++; 
  79.     } 
  80.      
  81.  
  82. void reverse(int index) 
  83.     int length = 0; 
  84.     for (int i = 0; i < 100; i++) 
  85.     { 
  86.         if (cache[index][i] == 0) 
  87.         { 
  88.             length = i; 
  89.             break
  90.         } 
  91.     } 
  92.      
  93.     for (i = 0; i < length; i++) 
  94.     { 
  95.         result[length - 1 - i] = cache[index][i]; 
  96.     } 
  97.     result[length] = 0; 

 


本文转自 dogegg250 51CTO博客,原文链接:http://blog.51cto.com/jianshusoft/620918,如需转载请自行联系原作者

上一篇:js的for in循环和java里的foreach循环的区别


下一篇:java20140417