问题 : 来简单地数个数(大数模拟计算斐波那契数+区间数数)
Posted Reqaw’s Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题 : 来简单地数个数(大数模拟计算斐波那契数+区间数数)相关的知识,希望对你有一定的参考价值。
题目描述
这是一个斐波那契数列:
f1 = 1
f2 = 2
fn = fn-1 + fn-2 (n>=3)
蔡老板想知道,给你两个数 a、b,你能否求出在区间[a,b]里有多少个斐波那契数。
f1 = 1
f2 = 2
fn = fn-1 + fn-2 (n>=3)
蔡老板想知道,给你两个数 a、b,你能否求出在区间[a,b]里有多少个斐波那契数。
输入
多组数据输入。一行为一组输入数据,包括两个非负整数 a、b(a <= b <= 10^100),当a=b=0 时输入终止。
输出
对每组输入,输出单独一行,包含一个整数表示区间[a,b]里的斐波那契数个数。
样例输入
10 100
1234567890 9876543210
0 0
样例输出
5
4
1 /* 2 问题 输入两个数a和b,表示一个区间(a <= b <= 10^100),问之间有多少个斐波那契数 3 解题思路 由于数据范围很大,所以要先将最大范围内的斐波那契数用大整数加法模拟出来,用字符串存储,再在该区间内 4 找到符合条件的数的个数 5 6 易错 7 第一个数是1,如果数组从0开始存的话,第一个斐波那契数是0,不是1,记住wa了九遍的原因。 8 */ 9 #include<cstdio> 10 #include<cstring> 11 #include<iostream> 12 using namespace std; 13 char f[600][200]; 14 15 void strsum(char sum[],char a[],char b[]); 16 int mycmp(char a[],char b[]); 17 void srev(char str[]); 18 19 int main() 20 { 21 strcpy(f[0],"1");//按照题目中说的第一个数为1,所以计数的时候千万要看清 22 strcpy(f[1],"2"); 23 int i,j; 24 for(i=2;i<600;i++){ 25 strsum(f[i],f[i-1],f[i-2]); 26 } 27 /*for(i=0;i<500;i++){ 28 cout<<i<<endl; 29 printf("%s\n",f[i]); 30 }*/ 31 char a[200],b[200]; 32 while(1){ 33 scanf("%s%s",a,b); 34 if(strcmp(a,"0")==0 && strcmp(b,"0")==0) 35 break; 36 37 int k,ans=0; 38 for(k=0;k<500;k++){ 39 if(mycmp(f[k],a) >= 0 && mycmp(b,f[k]) >= 0){ 40 //puts(f[k]); 41 ans++; 42 } 43 } 44 printf("%d\n",ans); 45 } 46 return 0; 47 } 48 49 void srev(char str[]) 50 { 51 int strl=strlen(str); 52 char s2[200]; 53 int i,j=0; 54 for(i=strl-1;i>=0;i--){ 55 s2[j++]=str[i]; 56 } 57 for(i=0;i<strl;i++){ 58 str[i]=s2[i]; 59 } 60 str[i]=‘\0‘; 61 } 62 63 int mycmp(char a[],char b[]) 64 { 65 int al=strlen(a),bl=strlen(b); 66 if(al != bl){ 67 if(al > bl) 68 return 1; 69 else 70 return -1; 71 } 72 else 73 { 74 int ans=strcmp(a,b); 75 if(ans > 0) 76 return 1; 77 else if(ans == 0) 78 return 0; 79 else 80 return -1; 81 } 82 } 83 84 void strsum(char strsum[],char a[],char b[]) 85 { 86 int al=strlen(a),bl=strlen(b); 87 srev(a); 88 srev(b); 89 int digsum[200]={0},i,j; 90 for(i=0;i<al && i<bl;i++){ 91 digsum[i] = (a[i] - ‘0‘)+(b[i] - ‘0‘); 92 } 93 94 j=i; 95 if(j < al){ 96 for(;j<al;j++){ 97 digsum[j] = (a[j] - ‘0‘); 98 } 99 } 100 j=i; 101 if(j < bl){ 102 for(;j<bl;j++){ 103 digsum[j] = (b[j] - ‘0‘); 104 } 105 } 106 107 int suml=al > bl?al:bl; 108 for(i=0;i<suml;i++){ 109 if(digsum[i] > 9){ 110 digsum[i+1] ++; 111 digsum[i] %= 10; 112 } 113 } 114 if(digsum[suml] != 0) 115 suml++; 116 j=0; 117 for(i=suml-1;i>=0;i--){ 118 strsum[j++] = digsum[i] + ‘0‘; 119 //printf("%d",digsum[i]); 120 } 121 strsum[j]=‘\0‘; 122 //printf("\n"); 123 srev(a); 124 srev(b); 125 }
以上是关于问题 : 来简单地数个数(大数模拟计算斐波那契数+区间数数)的主要内容,如果未能解决你的问题,请参考以下文章