UVA_10183||POJ_2413||ZOJ_1962||HDU_1316(大数加法、检索)

思路简单,打表知斐波拉切数列的第480项有101位。所以先把数列存在数组中,再用自定义的比较函数查找就行了。如果数据多的话还可以写成二分查找。

/**
**author :Skylon **
╭︿︿︿╮
{/ A  C /} 
 ( (oo) ) 
  ︶︶︶ 
**    **
**UVA_10183||POJ_2413||ZOJ_1962||HDU_1316题**
** 2014 年 7月 21日**
**/
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cctype>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
int FB[501][200];
int compare(int *x,int *y,int cd)//自定义的比较函数
{
	int len;
	for (len=199;len>=0;len--)
	{
		if (y[len]!=0)
		{
			break;
		}
	}
	len+=1;
	if (cd<len)
	{
		return -1;
	}
	else if (cd>len)
	{
		return 1;
	}
	else
	{
		for (int i=0;i<len;i++)
		{
			if (x[i]<y[len-i-1])
			{
				return -1;
			}
			if (x[i]>y[len-i-1])
			{
				return 1;
			}
		}
		return 0;
	}
}
int main()
{
    //freopen("Input.txt","r",stdin);
    // freopen("Output.txt","w",stdout);
    // system("color 5b");
    memset(FB,0,sizeof(FB));//打表哦!
    FB[1][0]=1;
    FB[2][0]=2;
    FB[3][0]=3;
    for (int i=4;i<500;i++)
    {
    	for (int j=0;j<200;j++)
    	{
    		FB[i][j]+=FB[i-1][j]+FB[i-2][j];
    	}
    	for (int k=0;k<200;k++)
    	{
    		if (FB[i][k]>9)
    		{
    			FB[i][k]%=10;
    			FB[i][k+1]+=1;
    		}
    	}
    }
    char a[200],b[200];
    while (1)
    {
    	scanf("%s%s",a,b);
    	if (strcmp(a,"0")==0&&strcmp(b,"0")==0)
    		break;
    	int A[200],B[200];
    	int len1=strlen(a);
    	int len2=strlen(b);
    	for (int i=0;i<len1;i++)
    	{
    		A[i]=a[i]-'0';
    	}
    	for (int i=0;i<len2;i++)
    	{
    		B[i]=b[i]-'0';
    	}
    	int s1,s2;
    	for (int i=1;i<500;i++)//从前往后找,找到第一个大于等于a的
    	{
    		if (compare(A,FB[i],len1)<=0)
    		{
    			s1=i;
    			break;
    		}
    	}
    	for (int i=499;i>=0;i--)//从后往前找,找到第一个小于等于b的
    	{
    		if (compare(B,FB[i],len2)>=0)
    		{
    			s2=i;
    			break;
    		}
    	}
    	printf("%d\n",s2-s1+1);//输出s2-s1,与样例相比差个1,然后加1
    }
    return 0;
}


你可能感兴趣的:(检索,大数加法,斐波拉切数列)