void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出两个数,求出这两个数之间有多少个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;
}
posted on 2011-04-17 13:03  void-man  阅读(671)  评论(0)    收藏  举报