ZOJ 1962

//ZOJ 1962
//大整数加法
//2010-3-19
#include<stdio.h>
#include<string.h>
#define M 102
void add(int *a, int *b, int *e,int &len);
int comp(int *c, int *d, int constlen, int len);
int main()
{
 char str1[M],
      str2[M];
 int  s1[M],
      s2[M],
      num1[M],
      num2[M],
      fib[M],
      constlen1,
      constlen2,
      len;
 
 scanf("%s %s",str1,str2);
 while(strcmp(str1,"0")!=0 || strcmp(str2,"0")!=0)//这个条件 哎 害苦了我啊 
 {                                                                                //终止条件 0 0  是&&关系
  int count,sta1,sta2,flag,i1,i2;
  count=0;
  constlen1=strlen(str1);
  constlen2=strlen(str2);
  len=1;
  for(i1=0; i1<constlen1; i1++)
    s1[constlen1-1-i1]=str1[i1]-'0';
  for(i2=0; i2<constlen2; i2++)
    s2[constlen2-1-i2]=str2[i2]-'0';
  for( ; i1<M; i1++)
    s1[i1]=0;
  for( ; i2<M; i2++)
    s2[i2]=0;
  num1[0]=0;
  num2[0]=1;
  fib[0]=0;
  for(int i=1; i<M; i++)
    num1[i]=num2[i]=fib[i]=0;
  flag=1;
  while(flag!=0)
  {
   add(num1,num2,fib,len);
   sta1=comp(fib,s1,constlen1,len);
   sta2=comp(fib,s2,constlen2,len);
   if(sta1>=0 && sta2<=0)
     count++;
      if(sta2>0)
       flag=0;
   for(int i=0; i<=len; i++)
     num1[i]=num2[i];
   for(int i=0; i<=len; i++)
     num2[i]=fib[i];
   for(int i=0; i<=len; i++)
     fib[i]=0;
  }
    
  printf("%d/n",count);
  scanf("%s %s",str1,str2);
 }
 return 0;
}
void add(int *a, int *b, int *e,int &len)
{
 for(int i=0; i<len; i++)
 {
  e[i]=e[i]+a[i]+b[i];
  e[i+1]=e[i+1]+e[i]/10;
  e[i]=e[i]%10;
 }
 for(int i=M-1; i>=len; i--)
   if(e[i])
     ++len;
}
int comp(int *c, int *d, int constlen, int len)
{
 if(len<constlen)
    return -1;
 for(int i=len-1; i>=0; i--)
    if(c[i]!=d[i])
       return c[i]-d[i];
 return 0;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值