2469: 【普及-】【P1255】数楼梯

内存限制:512 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:54 解决:9

题目描述

楼梯有 lns="http://www.w3.org/1998/Math/MathML"> 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入

一个数字,楼梯数,小于等于5000。

输出

输出走的方式总数。

样例输入 复制

4

样例输出 复制

5

提示


#include<bits/stdc++.h>
using namespace std;
int f[5010],n;
int main(){
    cin>>n;
    f[1]=1;
    f[2]=2;
    for (int i=3;i<=n;i++) {
    	f[i]=f[i-1]+f[i-2];
	}
	cout<<f[n];
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
#define maxn 5000
struct Bigint
{
	int len, a[maxn];
	Bigint(int x = 0)
	{
		memset(a, 0, sizeof(a));
		for (len = 1; x; len++)
			a[len] = x % 10, x /= 10;
		--len;
	}
	int &operator[](int i)
	{
		return a[i];
	}
	void flatten(int L)
	{
		len = L;
		for (int i = 1; i <= L; ++i)
		{
			a[i + 1] += a[i] / 10; a[i] %= 10;
		}
		for (; !a[len];)
			len--;
	}
	void print()
	{
		for (int i = max(len, 1); i >= 1; --i)
			printf("%d", a[i]);
	}
};
Bigint operator+(Bigint a, Bigint b)
{
	Bigint c;
	int len = max(a.len, b.len);
	for (int i = 1; i <= len; ++i)
		c[i] += a[i] + b[i];
	c.flatten(len + 1);
	return c;
}
Bigint operator*(Bigint a, int b)
{
	Bigint c;
	int len = a.len;
	for (int i = 1; i <= len; ++i)
		c[i] = a[i] * b;
	c.flatten(len + 11);
	return c;
}
int N;
int main(){
    cin >> N;
    Bigint f[5010];
    f[1] = Bigint(1);
    f[2] = Bigint(2);
    for (int i = 3; i <= N; i++)
        f[i] = f[i-2] + f[i-1];
    f[N].print();
    return 0;
}


#include<bits/stdc++.h>
using namespace std;
int a,b,c,n;
int main(){
    cin>>n;
    a=1;
    b=2;
    for (int i=3;i<=n;i++) {
    	c=a+b;
    	a=b;
    	b=c;
	}
	cout<<b;
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
int a[5000],b[5000],c[5000];//分别作为走一阶和走两阶楼梯的方法数,用字符数组防止溢出 
int main()
{
    int n;
    int x=1;//表示有几位数字,即数字的位数 
 	cin>>n;//表示阶梯数 
    if(n<3)//当只有一阶或者两阶的时候,一阶只有一种方式,两阶有两种走法,所以可以直接输出 
    {
        cout<<n;
        return 0;
    }
    a[1]=1;b[1]=2;//当只有一阶或者两阶的时候,一阶只有一种方式,两阶有两种走法
    
//1.既然太大的数字没有办法直接相加减,那么我们来模拟竖式的算法,逐位相加,满十进一。
//2.好了,那我们用 a,b 两个数组 来存两个加数,用 c 来存答案。
//3.那么就有以下等式 c[i]=a[i]+b[i],同时我们再判断,如果c[i]>9,那就向高一位进一即可。
//4.用x来就答案的长度,最后输出即可。


 	for(int i=3;i<=n;i++)//当有三个及以上的台阶 ,每多一个台阶都要进行方法数的更新 
    {
        for(int j=1;j<=x;j++)
            c[j]=a[j]+b[j];
        for(int j=1;j<=x;j++)
        {
            if(c[j]>9)//进位 
            {
                c[j+1]+=c[j]/10;
                c[j]%=10;
                if(j==x)  //在最高位c[j]也是大于9的情况下
                    x++;//更新进位数 
            }
        }
        //注意原理是斐波那契数列,所以 
        for(int j=1;j<=x;j++)
            a[j]=b[j];
        for(int j=1;j<=x;j++)
            b[j]=c[j];
    }
 	for(int i=x;i>0;i--)//因为前面逆序相加,所以后面要逆序输出 
        cout<<b[i];
    return 0;
}