UVa 10183 How Many Fibs?

UVa 10183 How Many Fibs?
高精度加法和高精度比较。
以下是我的代码:
#include < iostream >
#include
< string >
using   namespace  std;
typedef 
struct
{
    
long  a[ 120 ],len;
}bign;
const  bign _0 = {{ 0 }, 1 },_1 = {{ 1 }, 1 };
bign f[
607 ]; long  fn;
void  add(bign  & a,bign  & b,bign  & c)
{
    memset(c.a,
0 , sizeof (c.a));
    c.len
= (a.len > b.len ? a.len:b.len);
    
for ( long  i = 0 ;i < c.len;i ++ )
    {
       c.a[i]
+= a.a[i] + b.a[i];
       
if (c.a[i] >= 10 )
       {
          c.a[i
+ 1 ] ++ ;
          c.a[i]
-= 10 ;
       }
    }
    
if (c.a[c.len]) c.len ++ ;
}
int  cmp(bign  & a,bign  & b)
{
    
if (a.len > b.len)
      
return   1 ;
    
if (a.len < b.len)
      
return   - 1 ;
    
for ( long  i = a.len - 1 ;i >= 0 ;i -- )
      
if (a.a[i] > b.a[i])
        
return   1 ;
      
else   if (a.a[i] < b.a[i])
        
return   - 1 ;
    
return   0 ;
}
void  init()
{
    bign c;
    fn
= 1 ;
    f[
0 ] = f[ 1 ] = _1;
    
for ( long  i = 2 ;f[i - 1 ].len <= 101 ;i ++ )
    {
       add(f[i
- 1 ],f[i - 2 ],f[i]);
       fn
++ ;
    }
}
int  main()
{
    init();
    
string  s1,s2;
    
while (cin >> s1 >> s2)
    {
       
if (s1 == " 0 " && s2 == " 0 " break ;
       
       
long  ans;
       bign a,b;
       a.len
= s1.length(),b.len = s2.length();
       memset(a.a,
0 , sizeof (a.a));
       memset(b.a,
0 , sizeof (b.a));
       
for ( long  i = 0 ;i < a.len;i ++ ) a.a[i] = s1[a.len - i - 1 ] - ' 0 ' ;
       
for ( long  i = 0 ;i < b.len;i ++ ) b.a[i] = s2[b.len - i - 1 ] - ' 0 ' ;
       ans
= 0 ;
       
for ( long  i = 1 ;i <= fn;i ++ )
       {
          
if (cmp(b,f[i]) < 0 )
            
break ;
          
if (cmp(a,f[i]) <= 0 )
            ans
++ ;
       }
       printf(
" %ld\n " ,ans);
    }
return   0 ;
}


你可能感兴趣的:(UVa 10183 How Many Fibs?)