How many Fibs?(poj 2413)大数斐波那契的问题

tech2023-11-25  84

http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/C

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].

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 我所遇到的问题和解析都在代码中,可以参考一下

#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; int f[605][1000];//第一个下标代表第几个斐波那契数,第二个下 //标为存储斐波那契大数的数组 char shu[605][1000];//是为了更好的进行对比的拷贝数组 int main() { memset(f,0,sizeof(f)); memset(shu,0,sizeof(shu)); f[1][0]=1; f[2][0]=2; f[3][0]=3; for(int i=4;i<=600;i++){ for(int j=0;j<501;j++){ f[i][j]=f[i][j]+f[i-1][j]+f[i-2][j];//第一个问题; //为什么要多加一个f[i][j], //是因为下面有进位的现象,需要加上进位的值 if(f[i][j]>9){ f[i][j+1]=f[i][j]/10; f[i][j]=f[i][j]%10; } } //printf("%lld\n",f[i]); } int flag=0,k; for(int i=1;i<=600;i++){ flag=0;//第二个问题 //为什么要进行flag标记 //因为flag标记是为了去以防中间数也有零直接跳过,所以在第一个 // 非零输出先后,后面的数都要记下俩如果只是简单地用if(f[i][j]), // 会很容易跳过中间的零。 k=0; for(int j=500;j>=0;j--){ if(flag||f[i][j]){ flag=1; shu[i][k]=f[i][j]+'0'; k++; } } shu[i][k]='\0'; //printf("%s\n",shu[i]); } char m[601],n[601]; while(scanf("%s %s",&n,&m)){ if(n[0]=='0'&&m[0]=='0') break; int sum=0; int len1=strlen(n); int len2=strlen(m); // printf("%d %d++\n",len1,len2); for(int i=1;i<=500;i++){ //printf("%s\n",shu[i]); if(strlen(shu[i])>len1&&strlen(shu[i])<len2){ //如果这个数的长度在范围之(n,m)长度之间, //则这个数一定属于(n,m); //printf("%s\n",shu[i]); sum++; } else if(len1==len2&&strlen(shu[i])==len1&&strcmp(shu[i],n)>=0&&strcmp(shu[i],m)<=0){///如果(n,m)两个数长度一样,则比较他们在字典中的大小。 sum++; } else if(len1!=len2&&strlen(shu[i])==len1&&strcmp(shu[i],n)>=0){ //若果长度不相等(n,m),与前面的n长度相等,说明相对较小, //只需要和n比较大小(比n大就好) sum++; } else if(len1!=len2&&strlen(shu[i])==len2&&strcmp(shu[i],m)<=0){ //若果长度不相等(n,m),等与后面的m长度相等,说明相对较大, 只需要和m比较大小(比m小就好) sum++; } } printf("%d\n",sum); } return 0; }

strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。

最新回复(0)