Description 一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房M开始爬到蜂房N,M<N,有多少种爬行路线? Input 输入M,N的值。 Output 爬行有多少种路线。 Sample Input 1 14 Sample Output 377
C++ Code:
#include <iostream> #define SIZE 15001 using namespace std; int a[SIZE] = {0, 1}; int main(int argc, char** argv) { int n, m, i; cin >> m >> n; n -= m; n++; for (i = 2; i <= n; i++) { a[i] = a[i-1] + a[i-2]; } cout << a[n] << endl; return 0; }
gdgzoi的要高精度,高精度代码如下:
#include <iostream> #include <string> #define SIZE 15001 using namespace std; class bignum // 这是一个正高精度类 { public: string s; inline void read(void) // 输入 { cin >> s; return; } inline void write(void) // 输出 { cout << s; return; } inline bignum operator +(bignum bb) const // 加法 { bignum aa = *this; int i, t; if (aa.s.size() < bb.s.size()) // 两个字符串的长度不一样,要添0 { t = aa.s.size(); for (i = 1; i <= bb.s.size() - t; i++) { aa.s = "0" + aa.s; } } else { t = bb.s.size(); for (i = 1; i <= aa.s.size() - t; i++) { bb.s = "0" + bb.s; } } for (i = aa.s.size() - 1; i >= 0; i--) // 开始加法 { aa.s[i] += bb.s[i] - '0'; if (aa.s[i] > '9') { if (i) { aa.s[i] -= 10; aa.s[i-1]++; } else { aa.s[i] -= 10; // 最高位进位 aa.s = "1" + aa.s; } } } return aa; } }; bignum a[SIZE]; int main(int argc, char** argv) { int n, m, i; cin >> m >> n; n -= m; n++; a[1].s = "1"; for (i = 2; i <= n; i++) { a[i] = a[i-1] + a[i-2]; // 递推 } a[n].write(); // 输出 return 0; }