标签:
15 1 12 123 1234 12345 9 98 987 9876 98765 89 32 51075176167176176176 347746739 5610
Case #1: 0 Case #2: 25 Case #3: 226 Case #4: 1628 Case #5: 49516 Case #6: 15 Case #7: 15 Case #8: 15 Case #9: 43764 Case #10: 49750 Case #11: 10 Case #12: 51 Case #13: -1 Case #14: 1233 Case #15: 22374
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char a[100],b[100],c[100],t[100];
typedef struct s
{
	struct s * child[10];
	int id;
}node,*Node;
Node root;
void add(char a[],char b[],char c[])  
{  
    int len1,len2,i,j,t[10000],max,k=0;  
    len1=strlen(a);  
    len2=strlen(b);  
    i=len1-1;  
    j=len2-1;  
    memset(t,0,sizeof(t));  
    while(i>=0||j>=0)  
    {  
        if(i<0&&j>=0)  
            t[k]+=b[j]-'0';  
        else  
            if(j<0&&i>=0)  
                t[k]+=a[i]-'0';  
            else  
            {  
                t[k]+=a[i]-'0'+b[j]-'0';  
            }  
        k++;  
        t[k]+=t[k-1]/10;  
        t[k-1]%=10;  
        if(t[k])  
            max=k;  
        else  
            max=k-1;  
        i--;  
        j--;  
    }  
    for(i=max;i>=0;i--)  
        c[max-i]=t[i]+'0';  
    c[max+1]='\0';  
    //return c;  
}  
char str[3][100];
void insert(char *s,int id)
{
	Node cur,newnode;
	int i,now,len;
	len=strlen(s);
	cur=root;
	//int i;
	for(i=0;i<len&&i<41;i++)
	{
		now=s[i]-'0';
		if(cur->child[now]!=NULL)
		{
			cur=cur->child[now];
		}
		else
		{
			newnode=(Node)calloc(1,sizeof(node));
			cur->child[now]=newnode;
			cur=cur->child[now];
			cur->id=id;
		}
	}
}
int seach(char *s)
{
	int len=strlen(s),i;
	Node cur;
	cur=root;
	for(i=0;i<len;i++)
	{
		int now=s[i]-'0';
		if(cur->child[now]==NULL)
			break;
		cur=cur->child[now];
	}
	if(i<len)
		return -1;
	return cur->id;
}
void fun()
{
	strcpy(a,"1");
	insert(a,0);
	strcpy(b,"1");
	insert(b,1);
	for(int i=2;i<100000;i++)
	{
		int len1=strlen(a);
		int len2=strlen(b);
		if(len2>60)
		{
			b[len2-1]=0;
			a[len1-1]=0;
		}
		add(a,b,t);
		insert(t,i);
		strcpy(a,b);
		strcpy(b,t);
	//	if(i<30)
	//		printf("%s\n",t);
	}
}
int main()
{
	int t,c=0;
	root=(Node)calloc(1,sizeof(node));
	fun();
	scanf("%d",&t);
	while(t--)
	{
		char temp[50];
		scanf("%s",temp);
		printf("Case #%d: ",++c);
		printf("%d\n",seach(temp));
	}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
HDOJ 题目1789 Revenge of Fibonacci(大数, 字典树)
标签:
原文地址:http://blog.csdn.net/yu_ch_sh/article/details/47175077