问题及代码:
运行结果:
给定区间求斐波那契数数目。
Problem B How many Fibs
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 1 Accepted Submission(s) : 1
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Recall the definition of the Fibonacci numbers:
f1 := 1
f2 := 2
fn := fn-1 + fn-2 (n >= 3)
Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b].
f1 := 1
f2 := 2
fn := fn-1 + fn-2 (n >= 3)
Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b].
Input
The input contains several test cases. Each test case consists of two non-negative integer numbers a and b. Input is terminated by a = b = 0. Otherwise, a <= b <= 10^100. The numbers a and b are given with no superfluous leading zeros.
Output
For each test case output on a single line the number of Fibonacci numbers fi with a <= fi <= b.
Sample Input
10 100 1234567890 9876543210 0 0
Sample Output
5 4
/*
*Copyright (c)2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:HDU.cpp
*作 者:单昕昕
*完成日期:2015年3月3日
*版 本 号:v1.0
*/
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
char fibs[10005][102];
void add(int n)
{
int len_a=strlen(fibs[n-1]),len_b=strlen(fibs[n-2]);
int p=len_a-1,q=len_b-1;
int a[102],left=0;
for (int i=0; i<102; i++)
{
a[i]=left;
if (p>=0)
a[i]+=fibs[n-1][p--]-'0';
if (q>=0)
a[i]+=fibs[n-2][q--]-'0';
left=a[i]/10;
a[i]%=10;
}
int i;
for (i=101; i>=0; i--)
{
if (a[i]!=0)
break;
}
int k=0;
while (i>=0)
{
fibs[n][k++]=a[i--]+'0';
}
fibs[n][k]=0;
}
bool cmp(char *a,char *b)
{
int len_a=strlen(a),len_b=strlen(b);
if (len_a>len_b)
return true;
if (len_a<len_b)
return false;
int n=0;
while (n<len_a)
{
if (a[n]-'0'>b[n]-'0')
return true;
if (a[n]-'0'<b[n]-'0')
return false;
n++;
}
return true;
}
int main()
{
strcpy(fibs[0],"1");
strcpy(fibs[1],"2");
int k=1;
while (strlen(fibs[k++])<101)
{
add(k);
}
char a[102],b[102];
while(scanf("%s %s",a,b),strcmp(a,"0")!=0||strcmp(b,"0")!=0)
{
int count=0;
for (int i=0; i<=k; i++)
{
if (cmp(fibs[i],a)==false)
continue;
if (cmp(fibs[i],a)==true && cmp(b,fibs[i])==true)
count++;
if (cmp(b,fibs[i])==false)
break;
}
cout<<count<<endl;
}
return 0;
}
运行结果:
给定区间求斐波那契数数目。
学习心得:
高精度模拟,请收下我的膝盖。。