大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: f0 = 0; f1 = 1; fi = fi-1 + fi-2
现在给你一个数x,聪明的你一定知道这是斐波那契数列中的第几项。
(数据保证x一定有对应的项y,且 2 <= y < 1e4)
输入
第一行一个整数T,表示测试组数。
之后的T行,每行一个数x
输出
对于每个测试数据,输出一行表示数x是第几项
样例输入
2 2 5
样例输出
3 5
#include <stdio.h>
#include <string.h>
#include <map>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
map<string,int>ma;
char a[10000];
char b[10000];
char c[10000];
char d[10000];
void dashu(char a[],char b[],char c[])
{
int len1,len2,i,M=0,L=0;
char tmp;
len1=strlen(a);
len2=strlen(b);
for(i=0;i<len1/2;i++)
{
tmp=a[i];
a[i]=a[len1-i-1];
a[len1-i-1]=tmp;
}
for(i=0;i<len2/2;i++)
{
tmp=b[i];
b[i]=b[len2-i-1];
b[len2-i-1]=tmp;
}
for(i=0;i<len1&&i<len2;i++)
{
M=(a[i]-'0'+b[i]-'0'+L)%10;
L=(a[i]-'0'+b[i]-'0'+L)/10;
c[i]='0'+M;
}
if(i<len1)
{
for(;i<len1;i++)
{
M=(a[i]-'0'+L)%10;
L=(a[i]-'0'+L)/10;
c[i]='0'+M;
}
}
if(i<len2){
for(;i<len2;i++){
M=(b[i]-'0'+L)%10;
L=(b[i]-'0'+L)/10;
c[i]='0'+M;
}
}
while(L){
c[i++]=L+'0';
L/=10;
} //大数相加模板
}
void reserve(char d[])
{
int i,len1;char tmp;
len1=strlen(d);
for(i=0;i<len1/2;i++)
{
tmp=d[i];
d[i]=d[len1-i-1];
d[len1-i-1]=tmp;
}
}
/*int find(char d[])
{
int i;
strcpy(a,"0");
strcpy(b,"1");
for(i=2;i<10003;i++)
{
dashu(a,b,c) ;
reserve(b);
strcpy(a,b);
reserve(c);
ma[c]=i; //相加得到每一项,记录是第几项
strcpy(b,c);
}
}*/
int main()
{
int t;
int i;
strcpy(a,"0");
strcpy(b,"1");
for(i=2;i<10003;i++)
{
dashu(a,b,c) ;
reserve(b);
a[10000]={'0'};
strcpy(a,b);
reserve(c);
ma[c]=i;
b[10000]={'0'} ;//相加得到每一项,记录是第几项
strcpy(b,c);
}
scanf("%d",&t);
getchar();
while(t--)
{
// cin>>d;
scanf("%s",d);
// reserve(d);
printf("%d\n",ma[d]);
}
return 0;
}
第二个
#include <stdio.h>
#include <string>
#include <map>
#include <string.h>
using namespace std;
typedef unsigned long long ull;
typedef pair<int, int> pii;
ull f[10004];
char a[10000000];
map<ull,int>ma;
/*void qwe(ull f[])
{
int i;
f[0]=0;
f[1]=1;
ma[0]=0;ma[1]=1;
for(i=2;i<10003;i++)
{
f[i]=f[i-1]+f[i-2];
ma[f[i]]=i;
}
}*/
int main()
{
int t,i,len;
f[0]=0;
f[1]=1;
ma[0]=0;ma[1]=1;
for(i=2;i<10003;i++)
{
f[i]=f[i-1]+f[i-2];
ma[f[i]]=i;
}
ull ans=0;
scanf("%d",&t);
while(t--)
{
scanf("%s",a);
ans=0;
len=strlen(a);
for(i=0;i<len;i++)
{
ans=ans*10+a[i]-'0';
}
printf("%d\n",ma[ans]);
}
}
这个题我做了好长时间,最终在大佬的帮助下才对(不过还好结果是好的)