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;
}