又是斐波那契数列??

 

大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: 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]);
	}
}

这个题我做了好长时间,最终在大佬的帮助下才对(不过还好结果是好的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值