问题回顾:
现在一共有n阶楼梯,你可以一次跨1节楼梯,也可以一次跨2节,给出跨n节楼梯的总的方法数。1<=n<=50.
例1:
输入: 5
输出: 8
例2:
输入: 1
输出: 1
我自己写了一个程序,结果前38节楼梯的结果都是对的,从第39节楼梯开始出错。不知何故?
我的程序:
#include<iostream> using namespace std; long long C_a_b(int a, int b) { int i_for, a_; long long temp1 = 1, temp2 = 1; a_ = a; for (i_for = 0; i_for < a; i_for++) { temp1 *= b; b -= 1; } for (i_for = 0; i_for < a_; i_for++) { temp2 *= a; a -= 1; } return (temp1 / temp2); } int main() { long long answer = 1; int n, m_max; int i_for; cin >> n; m_max = n / 2; for (i_for = 1; i_for < m_max + 1; i_for++) { answer += C_a_b(i_for, n - i_for); } cout << answer << endl; cin >> n; return 0; }
正确的结果的代码:
#include<iostream> using namespace std; int main() { int i_for,length; cin >> length; long long *data=new long long[length]; data[0] = data[1] = 1; data[2] = 2; for (i_for = 3; i_for < length; i_for++) { data[i_for] = data[i_for - 1] * 2 - data[i_for - 3]; } cout << data[length - 1] << endl; delete []data; return 0; }
我就郁闷了,前面38个台阶爬的好好地,为什么到了第39个台阶就不行了?果然程序还是要简洁点好吗!!!
这个bug先整理出来放在这里。
下面几张图是调试截图:
总结:
程序产生的中间变量不能太大。简单易行的算法才是好算法!!!!