poj 2413 大数模拟(区间内的斐波那契数个数)

题意:给定两个数a<=b<=10^100,求区间[a,b]内的斐波那契数的数量。

思路:数组模拟枚举出100位以内的斐波那契数,然后写一个比较函数进行比较即可。其中一个地方让我wa了n次:temp = f[i-2][j]+f[i-1][j]+f[i][j];写成了temp = f[i-2][j]+f[i-1][j];快哭了~~~

#include <stdio.h>
#include <string.h>
#define N 155
int f[1000][N];
char a[N],b[N];
int len=1,num;
int fibo(){
    int i,j,temp;
    memset(f,0,sizeof(f));
    f[0][0] = 1;
    f[1][0] = 2;
    for(i = 2;len<101;i++){
        for(j = 0;j<len;j++){
            temp = f[i-2][j]+f[i-1][j]+f[i][j];//~~~~~~~~~~~~~~
            f[i][j] = temp % 10;
            f[i][j+1] = temp / 10;
        }
        if(f[i][len])
            len++;
    }
    return i-1;
}
int cmp(char x[N],int y[N]){
    int i,j,strl;
    strl = strlen(x);
    for(i = 100;i>=0;i--)
        if(y[i])
            break;
    if(strl == i+1){
        for(j = i;j>=0;j--){
            if(x[j] > (char)(y[j]+'0'))
                return 1;
            if(x[j] < (char)(y[j]+'0'))
                return -1;
        }
        return 0;
    }
    else if(strl > i+1)
        return 1;
    return -1;
}
void reverse(char* x){//将字符串逆转
    int i,k = strlen(x);
    char j;
    for(i = 0;i<k/2;i++){
        j = x[k-1-i];
        x[k-1-i] = x[i];
        x[i] = j;
    }
}
int main(){
    num = fibo();//产生100位以内的斐波那契数列
    while(scanf("%s %s",a,b)){
        int i,res=0;
        if(a[0] == '0' && b[0] == '0')
            break;
        reverse(a);
        reverse(b);
        
        for(i = 0;i<num && cmp(b,f[i])>=0;i++)
            if(cmp(a,f[i])<=0)
                res++;
        printf("%d\n",res);
     }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值