How many Fibs?---改进

本文深入探讨了一个基于斐波那契数列的算法实现,特别关注于字符串比较和大数相加的处理技巧。通过分析源代码,详细解释了如何使用字符串操作来解决大数运算的问题,并讨论了在比较斐波那契数列元素时可能出现的边界情况。

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

这题算是卡了我很久了因为我的思维现在还跟不上算法…其实主要原因是菜。。

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

**int cmp(string a,string b){
	if(b.size()==a.size()){
		if(a==b)
			return 0;
		return a>b ? 1:-1;
	}
	return a.size()>b.size() ? 1:-1;
}**

string add(string s1,string s2){
	string s;
	int len1=s1.size()-1;
	int len2=s2.size()-1;
	int temp,num=0;//temp 临时存放数据,num为进位
	while(len1>=0&&len2>=0){
		temp=(s1[len1]-'0')+(s2[len2]-'0')+num;
		s+=char(temp%10+'0');//将每一位储存 
		num=temp/10; 
		len1--;
		len2--;
	}
	while(len1>=0){
		temp=(s1[len1]-'0')+num;
		s+=char(temp%10+'0');
		num=temp/10; 
		len1--;
	}
	while(len2>=0){
		temp=(s2[len2]-'0')+num;
		s+=char(temp%10+'0');
		num=temp/10; 
		len2--;
	}
	if(num>0){//全部加完还有进位
		s+=char(num+'0');
	} 
	reverse(s.begin(),s.end());//反转s 
	return s; 
}
void fib(string fibs[500]){
	fibs[1]="1";//初始化fibs
	fibs[2]="2";
	for(int i=3;i<=485;i++){
		fibs[i]=add(fibs[i-1],fibs[i-2]);
	}
} 

int main(){
	string a,b;
	string fibs[500];
	fib(fibs);
	while(cin>>a>>b){
		if(a=="0"&&b=="0")
			break;
		else{
			int count=0;
			for(int i=1;i<=485;i++){
				**if(cmp(a,fibs[i])<=0&&cmp(b,fibs[i])>=0){//fibs[i]比a大,fibs[i]比b小** 
					count++; 
				}else if(cmp(b,fibs[i])==0){
					break;
				}	
			}
			cout<<count<<endl;	
		}
	}
	return 0;
} 

加**的地方是我没考虑到的情况也就是a,b斐列波数一致的时候。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值