• hdu 1316 How Many Fibs? (大数问题)


    嘿嘿,先将每一个Fib打表,之后,就是很暴力的在区间内找咯。

    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<math.h>
    #define maxn 600
    using namespace std;
    int sum[maxn+1][50],len1[maxn+1];
    int a[50],b[50],la,lb;
    char str1[110],str2[110];
    void init()
    {
    	sum[0][0]=0;len1[0]=0;
    	sum[1][0]=1;len1[1]=0;
    	sum[2][0]=2;len1[2]=0;
    	for(int i=3;i<=maxn;i++)
    	{
    		int k=0,j;
    		for(j=0;j<=len1[i-2];j++)
    		{
    			int t=k+sum[i-1][j]+sum[i-2][j];
    			k=t/10000;
    			sum[i][j]=t%10000;
    		}
    		while((j-1)!=len1[i-1])
    		{
    			int t=k+sum[i-1][j];
    			k=t/10000;
    			sum[i][j]=t%10000;
    			j++;
    		}
    		while(k)
    		{
    			int t=k;
    			k=t/10000;
    			sum[i][j]=t%10000;
    			j++;
    		}
    		len1[i]=j-1;
    	}
    }
    int compare(int *s,int l,int num)
    {
    	if(l>len1[num])
    		return 1;
    	else if(l<len1[num])
    		return -1;
    	for(int i=l;i>=0;i--)
    	{	
    		//cout<<s[i]<<' '<<sum[num][i]<<endl;
    		if(s[i]>sum[num][i])
    		
    			return 1;
    		else if(s[i]<sum[num][i])
    			return -1;
    	}
    	return 0;
    }
    void solve()
    {
    	int t1=1;
    	while(la<len1[t1])t1++;//找出第一个长度大于等于左区间Fib
    	int i;
    	for(i=t1;i<=maxn;i++)//找出第一个大于左区间的Fib
    	{	
    		if(compare(a,la,i)<=0)
    			break;
    	}
    	int j;
    	for(j=i;j<=maxn;j++)//找出第一个大于右区间的Fib
    	{
    		if(compare(b,lb,j)<0)
    			break;
    	}
    	printf("%d\n",j-i);
    }
    int main()
    {
    	int n,len;
    	init();
    	while(scanf("%s %s",str1,str2)==2)
    	{
    		if(strcmp(str1,"0")==0 && strcmp(str2,"0")==0)
    			break;
    		int s1=strlen(str1),s2=strlen(str2);
    		la=lb=0;
    		for(int i=s1-1;i>=0;i-=4)//将字符串转换为大数的存储方式,四位四位保存进整型数组
    		{
    			int s=0;
    			for(int j=0;j<4&&(i-j)>=0;j++)
    				s+=(int)pow(10.0,j)*(str1[i-j]-'0');
    			a[la++]=s;
    		}
    		for(int i=s2-1;i>=0;i-=4)
    		{
    			int s=0;
    			for(int j=0;j<4&&(i-j)>=0;j++)
    				s+=(int)pow(10.0,j)*(str2[i-j]-'0');
    			b[lb++]=s;
    		}
    		la--;lb--;
    		solve();
    	}
    	return 0;
    }
    
  • 相关阅读:
    selenium 模拟键盘事件 复制粘贴、右键、回车等
    02安卓用户界面优化之(二)SlidingMenu使用方法
    02Android用户界面优化之(一)Android Fragment
    (九)Android权限系统
    Android SDK 在线更新镜像服务器资源
    (八)Android广播接收器BroadcastReceiver
    (七)Android中AIDL的应用与理解
    (六)Android中Service通信
    (五)认识Android中的Service
    Gradle中文乱码
  • 原文地址:https://www.cnblogs.com/nanke/p/2230843.html
Copyright © 2020-2023  润新知