hdu1316 How Many Fibs?

本文介绍了一种使用C语言实现的大整数斐波那契数列计算方法,通过结构体存储每项的长度和字符数组表示的数值,支持长度达到200位的大整数运算。该程序还实现了比较两个大整数大小的功能,并能够计算出用户输入的两个斐波那契数之间的间隔。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  

struct node  
{  
	int len;  
	char c[200];  
}Fib[502];  

int cmp(int len,int indx,char *ch)
{
	int i,j;
	for (i=0,j=len-1;i<len;i++,j--)
	{
		if(Fib[indx].c[j]>ch[i])
			return 1;
		else if(Fib[indx].c[j]<ch[i])
			return -1;
	}
	return 0;
}

void add(int x,int y)  
{  
	int len1,len2,i,j,k;  
	len1=Fib[x].len;  
	len2=Fib[y].len;  
	for (i=0,j=0,k=0;i<len1;i++,j++)  
	{  
		Fib[x+1].c[k]=(Fib[x].c[i]-'0'+(j<len2?(Fib[y].c[j]-'0'):0))+'0';  
		k++;  //和的结果低位保存在低位
	}  
	for(i=0;i<k;i++)  
		if((Fib[x+1].c[i]-'0')>9)  
		{  
			if(Fib[x+1].c[i+1]==0)  
				Fib[x+1].c[i+1]=((Fib[x+1].c[i]-'0')/10)+'0';  
			else  
				Fib[x+1].c[i+1]=((Fib[x+1].c[i+1]-'0')+(Fib[x+1].c[i]-'0')/10)+'0';  
			Fib[x+1].c[i]=((Fib[x+1].c[i]-'0')%10)+'0';  
		}  
		if(Fib[x+1].c[len1]!=0)//两数相加最多进一位  
			Fib[x+1].len=len1+1;  
		else  
			Fib[x+1].len=len1;  
}  

int main()  
{  
	int x,y,i; 
	char s1[120],s2[120];
	strcpy(Fib[1].c,"1");  
	Fib[1].len=1;  
	strcpy(Fib[2].c,"2");  
	Fib[2].len=1;  
	for(i=3;i<=500;i++)  
		add(i-1,i-2);  
	while(scanf("%s %s",s1,s2))
	{
		int len1,len2,len;
		if(s1[0]=='0'&&s2[0]=='0')
			break;
		len1=strlen(s1);
		len2=strlen(s2);
		for (i=1;i<=500;i++)
		{
			len=Fib[i].len;
			if(len<len1)
				continue;
			else if(len1<len)
			{
				x=i;
				break;
			}
			else if(len==len1&&(cmp(len,i,s1)>=0))
			{
				x=i;
				break;
			}
		}
		for(i=500;;i--)
		{
			len=Fib[i].len;
			if(len>len2)
				continue;
			else if(len2>len)
			{
				y=i;
				break;
			}
			else if(len==len2&&(cmp(len,i,s2)<=0))
			{
				y=i;
				break;
			}
		}
		printf("%d\n",y-x+1);
	}
	return 0;  
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值