高精度求斐波那契数列中间个数

来源:互联网 发布:用c 计算矩阵特征值 编辑:程序博客网 时间:2024/05/22 04:39
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;


char fb[1003][1005];


int compare(char a[],char b[])
{
    int i, n, m;
     n=strlen(a);
    m = strlen(b);
    if (n>m)
        return 1;
    else if (n< m)
        return 0;
    else{
        for (i = 0; i < n; i++){
            if (a[i]>b[i])
                return 1;
            else if (a[i]<b[i])
                return 0;
            else continue;
        }
    }
    return -1;
}


void cal(char a[],char b[],int t)
{
    int c[1000],d[1000];
    memset(c,0,sizeof(c));
    memset(d,0,sizeof(d));
    int i, j, k, m, n;
    i = 1;
    n=strlen(a);
    m = strlen(b);
    for (k = n-1; k>=0; k--){
        c[i++]= a[k]-'0';
    }
    j = 1;
    for (k = m-1; k>= 0; k--){
        d[j++]= b[k]-'0';
    }
    k = n>m?n:m;
    for (i = 1; i <= k; i++){
        c[i+1]+= (c[i]+d[i])/10;
        c[i]= (c[i]+d[i])%10;
    }
    if (c[k+1])
        ++k;
    j=0;
    for (i = k; i >= 1; i--){
        fb[t][j++]=c[i]+'0';
    }


}


int main()
{
    char s1[1000], s2[1000];
    int i, j;
    memset(fb,'\0',sizeof(fb));


    fb[1][0] = '1';
    fb[2][0] = '2';


    for (i = 3; i <= 1000; i++){
        cal(fb[i-1],fb[i-2],i);
    }


    while(scanf("%s %s",s1,s2)){
            int sum = 0;
        if(!((s1[0]-'0')||(s2[0]-'0')))
            break;


        for (i = 1; i <= 1000; i++){
            if (compare(fb[i],s1)==-1){
                sum = 1;
                i++;
                break;
            }
            else if (compare(fb[i],s1)>0){
                sum = 0;
                break;
            }
        }
        for (j = i; j <= 1000; j++){
            if (compare(fb[j],s2)<=0){
               sum++;
            }
            else
               break;
        }
        printf("%d\n",sum);
    }
    return 0;
}
0 0
原创粉丝点击