心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
高精度加法和高精度比较。
以下是我的代码:
#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;
}


posted on 2010-02-22 17:21 lee1r 阅读(634) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数学/数论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理