其他分享
首页 > 其他分享> > 蜜蜂路线

蜜蜂路线

作者:互联网

蜜蜂路线_高精

题目

一只蜜蜂在数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在请编程计算:蜜蜂从蜂房m开始爬到蜂房n,1<=m<n<=1000,有多少种爬行路线?

思路

读懂题目后,可能会有点蒙。但不急,先找规律。**到一个点的路线个数等于能到这个点的两点路线个数相加,**于是就有了0 1 3 8 21…
1 2 5 13 34…
摊开就是 0 1 1 2 3 5 8 13 21 34好家伙,就是肥不拉 ,呸,斐波那契数列!
先别激动,看数据,n<=1000,第一千个数是什么呢?不用问,肯定大到没没朋友,直接上高精,高精加题。

代码

#include<bits/stdc++.h>
using namespace std;
int m,n;
string p[2021];
string jia(string a,string b)
{
    int x[500],y[500],z[500];
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    memset(z,0,sizeof(z));
    for(int i=0;i<a.size();i++)
    {
        x[a.size()-i]=int(a[i])-48;
    }
    for(int i=0;i<b.size();i++)
    {
        y[b.size()-i]=int(b[i])-48;
    }
   long long c=max(a.size(),b.size());
    for(int i=1;i<=c;i++)
    {
        z[i]+=x[i]+y[i];
        if(z[i]>=10)
        {
            z[i+1]++;
            z[i]%=10;
        }
    }
    if(z[c+1]!=0)
    {
        c++;
    }
    string giao;
    giao="";
    for(int i=c;i>=1;i--)
    {
        giao+=char(z[i]+48);
    }
    return giao;
}
int main()
{
    cin>>m>>n;
    p[1]="0",p[2]="1";
    for(int i=3;i<=n-m+2;i++)
    {
        p[i]=jia(p[i-1],p[i-2]);
    }
    cout<<p[n-m+2];
    return 0;
}

总结

其实就是一道高精加的题目,读懂题目,要有一定数学基础。主要弄明白高精度为什么要倒叙输入输出,掌握高精进位推位。本蒟蒻第一次写博客,不喜勿喷。

标签:string,int,memset,路线,蜜蜂,giao,蜂房,size
来源: https://blog.csdn.net/SSL_HHY/article/details/113453139