zoj1962

这个题啊,好像有点变态,就是有两个1,却只能输出一个,哎呀,大数加法啊,因为还没学STL,就写了很多函数,仰慕那些全是字符串处理的,各种看不懂,水啊啊啊啊啊

 

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

const int Num = 490;
const int Len = 110;

void Add(int a[],int b[],int c[])
{
 int i = 1;
 for(;i < Len;++i)
  c[i] = a[i] + b[i];
 
 for(i = 1;i < Len;++i)
 {
  c[i + 1] += c[i] / 10;
  c[i] %= 10;
 }
}

int length(int a[])
{
 int i = Len - 1;
 for(;i > 0 && !a[i];--i);
 
 if(!i) return 1;
 else return i;
}

int Max(int a[],int b[])
{
 int i;
 if(length(a) != length(b)) return length(a) > length(b);
 else
 {
  for(i = length(a);i > 0;--i)
  {
   if(a[i] != b[i]) return a[i] > b[i];
  }
 }
 
 return -1;
}

void getNum(char s[],int a[])
{
 int i = 1,len = strlen(s);
 
 for(;i <= len;++i)
  a[i] = s[len - i] - '0'; 
}

int main(void)
{
 int fibo[Num][Len];
 int i,j,sum ;
 char left[Len],right[Len];
 int ll[Len],rr[Len];
 
 memset(fibo,0,sizeof(fibo));
 fibo[1][1] = 1;fibo[2][1] = 1;
 
 for(i = 3;i < Num;++i)
  Add(fibo[i - 1],fibo[i - 2],fibo[i]);
  
 while(cin >> left + 1 >> right + 1 && (strcmp(left + 1,"0") || strcmp(right + 1,"0")))
 {
  sum  = 0;
  memset(ll,0,sizeof(ll));memset(rr,0,sizeof(rr));
  getNum(left + 1,ll);getNum(right + 1,rr);
  
  for(i = 1;i < Num && !Max(fibo[i],ll);++i);
  
  for(i;i < Num;++i)
  {
   if(Max(fibo[i],rr) <= 0) sum++;
   else break;
  }
  
  if(Max(fibo[1],ll) != 0 && Max(fibo[1],rr) <= 0) sum --;
  cout << sum << endl;
 }
 
 system("pause");
 return 0;
}
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值