爬楼梯算法 bug 容易被忽视的变量越界

问题回顾:

  现在一共有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先整理出来放在这里。

下面几张图是调试截图:

 

总结:

  程序产生的中间变量不能太大。简单易行的算法才是好算法!!!!

posted @ 2016-06-05 18:57  gukz  阅读(639)  评论(0编辑  收藏  举报