uva110601斐波那契计数

//(斐波那契计数)
//1.求出1到100位的斐波那契数。
//2.将结果存在vector<string> gh;
//3.将开始的位置和结束的位置映射到结果中 求出斐波那契数的个数。
//方法:利用字符串完成加法运算
//刚开始以为是找规律想了很久没结果  又看了下打印的数发现密度比较大 直接放弃了
//string gh;
//gh.append(1,'w');意思是:在gh后面加一个‘w';后面只能加字符
//gh.append("dsjfhskfksd");在gh的后面加一个字符串
//注意细节问题
感受:当在做一道题目的时候,感觉有捷径 但是自己又没找到  我认为最好的方法就是最笨的方法
#include<iostream>
#include<cstdio>
#include<vector>
#define max 101
using namespace std;
vector<string> str;
string Fi_add(string a,string b)//在处理的过程中位数越低数越靠前。
{
    string tem;
    int num=0;
    int jin=0;
    char nu1;
    for(int i=0; i<a.length(); i++)
    {
        num=(a[i]-'0')+(b[i]-'0')+jin;
        jin=num/10;
        nu1=num%10+'0';
        tem.append(1,nu1);
    }
    for(int j=a.length(); j<b.length(); j++)
    {
        num=(b[j]-'0')+jin;
        jin=num/10;
        nu1=num%10+'0';
        tem.append(1,nu1);
    }
    if(jin)
    {
        tem.append(1,'1');
    }
    return tem;
}
void Fi()
{
    string a="1";
    string b="2";
    str.push_back(a);
    str.push_back(b);
    string tem;
    while(b.length()<max)
    {
        tem=Fi_add(a,b);
        a=b;
        b=tem;
        str.push_back(tem);
    }
    return;
}
int  compare(string a, string b)//小于返回-1,大于返回1,等于返回0
{
    if(b.length()!= a.length())
       return a.length() > b.length() ? 1 : -1;
    for (int i = 0, j = b.length() - 1; i < a.length(); i++, j--)
        if (a[i] != b[j])
            return a[i]> b[j] ? 1 : -1;
    return 0;
}
int main()
{
    string a,b;
    Fi();
    int start,end;
    while(cin>>a>>b)
    {
        if(a=="0"&&b=="0") break;
        for(int i=0; i<str.size(); i++) //此时str中的数是倒序存的
        {
            if(a.length()>str[i].length())
                continue;
            if(compare(a,str[i])<=0)
            {
                start=i;
                break;
            }
        }
        for(int i=str.size()-1; i>=0; i--) //此时str中的数是倒序存的
        {
            if(b.length()<str[i].length())
                continue;
            if(compare(b,str[i])>=0)
            {
                end=i;
                break;
            }
        }
      //  printf("%d %d\n",start,end);
        printf("%d\n",end-start+1);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值