hoj1047-How Many Fibs?(高精度fib序列)


给出两个数,求出这两个数之间有多少个fib数, 但是题目给出的数是10^100所以要用大数来处理

用大数相加算法,求出fib[1024]之内的所有数,然后再找出两数之前多少个开始统计

#include <iostream>
#include
<string>

using namespace std;

string operator +(const string &a, const string &b)
{
int i;
int sum[2001] = {0};
int len1 = strlen(a.c_str());
int len2 = strlen(b.c_str());
for(i = 0; i<len1; i++)
sum[i]
+= a.at(len1 - 1 - i) - '0';
for(i = 0; i<len2; i++)
sum[i]
+= b.at(len2 - 1 - i) - '0';
int max = len1 > len2 ? len1 : len2;
for(i = 0; i < max; i++)
{
if(sum[i] > 9)
{
sum[i
+ 1] += sum[i] / 10;
sum[i]
%= 10;
if(i == max - 1)
max
++;

}
}
string tmp("");
for(i = max - 1; i >= 0; i--)
tmp
+= (sum[i] + '0');
return tmp;
}
static string fib[1024];

int main()
{
string a,b;
fib[
0] = "1";
fib[
1] = "1";
for(int i = 2; i < 1024; i++)
{
fib[i]
= fib[i - 1] + fib[i - 2];
}
fib[
0] = "0";
int n;
while(cin >> a >> b &&(a[0]-'0'||b[0]-'0'))
{
int i=1,c=0;
while(1) //找出不小于a的第一个fib数的下标
{
if(fib[i].length() > a.length()) break;
else if(fib[i].length() == a.length() && fib[i]>=a) break;
i
++;
}
while(1)
{
if(fib[i]==b) {c++;break;}
if(fib[i].length() > b.length()) break;
else if(fib[i].length() == b.length() && fib[i]>b) break;
i
++;
c
++;
}
cout
<< c << endl;
}
return 0;
}
优质内容筛选与推荐>>
1、ServiceStack.Redis的问题与修正
2、[Android Pro] AndroidStudio IDE界面插件开发(Hello World篇)
3、轻快的VIM(一):移动
4、leetcode -- Valid Parentheses
5、为你的水晶报表装载本地图片【转】


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号