您的位置:首页 > 其它

POJ 2413 How many Fibs?

2014-06-14 13:55 405 查看
大数区间Fibonacci数的个数

const int maxn = 9999 ; // 每位储存4位
const int dig = 4 ;

class BigNum{
public  :
int  a[60] ;
int  len ;
BigNum(){len = 1 ; memset(a , 0 , sizeof(a)) ;}
BigNum(const int) ;
BigNum(const char*) ;
BigNum operator +(const BigNum &) const ;
bool operator >= (const BigNum &) const ;
friend ostream& operator <<(ostream &out , const BigNum&T) ;
};

BigNum::BigNum(const int T){
int t = T ;
len = 0 ;  memset(a , 0 , sizeof(a)) ;
while(t > maxn){
a[len++] = t - t/(maxn+1)*(maxn+1) ;
t = t/(maxn+1) ;
}
a[len++] = t ;
}

BigNum::BigNum(const char* s){
memset(a , 0 , sizeof(a)) ;
int t , i , j , k , id = 0 , l = strlen(s) ;
len = l/dig ;
if(l%dig) len++ ;
for(i = l-1 ; i >= 0 ; i -= dig){
t = 0 ;
k = max(0  , i - dig + 1);
for(j = k ; j <= i ; j++)  t = t*10 + s[j] - '0' ;
a[id++] = t ;
}
}

ostream& operator <<(ostream &out , const BigNum&T){
printf("%d" , T.a[T.len-1]) ;
for(int i = T.len-2 ; i >= 0 ; i--)  printf("%04d" ,T.a[i]) ;
return out ;
}

BigNum BigNum::operator + (const BigNum &T) const{
BigNum s ;
s.len = max(len , T.len) ;
for(int i = 0 ; i < s.len ; i++){
s.a[i] += a[i] + T.a[i] ;
if(s.a[i] > maxn){
s.a[i+1]++ ;
s.a[i] %= (maxn+1) ;
}
}
if(s.a[s.len]!=0) s.len++ ;
return s ;
}

bool BigNum::operator>= (const BigNum &T) const{
if(len > T.len)  return 1 ;
else if(len == T.len){
int i = len-1 ;
while(i >= 0 && a[i] == T.a[i]) i-- ;
if(i >= 0 && a[i] < T.a[i]) return 0 ;
else return 1 ;
}
else  return 0 ;
}

vector <BigNum> lis ;

int  main(){
lis.clear()  ;
lis.push_back(BigNum("1")) ;
lis.push_back(BigNum("2")) ;
int i  , s ;
for(i = 2 ;  ; i++){
BigNum b = lis[i-1] + lis[i-2] ;
if(b.len > 100)  break  ;
lis.push_back(b) ;
}
BigNum l , r ;
char a[108] , b[108] ;
while(scanf("%s%s" ,a , b)){
if(strcmp(a , "0")== 0 &&  strcmp(b , "0") == 0)  break ;
l = BigNum(a) , r = BigNum(b) ;
for(i = s = 0  ; i < lis.size() ; i++){
if(lis[i] >= l && r >= lis[i]) s++ ;
}
printf("%d\n" , s) ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: