大菲波数

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12716    Accepted Submission(s): 4352


Problem Description
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。
 
Input
输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。
 
Output
输出为N行,每行为对应的f(Pi)。
 
Sample Input
5 1 2 3 4 5
 
Sample Output
1 1 2 3 5
 

 思路:很纯粹的高进度加法

#include<cstdio>
#include<cstring>
char ans[1005][500];
//二维数组的一个维传递到自定义函数,这个维相当于独立的一个数组,t记录此时main中的i
void plus(char a[],char b[],int t)
{
    int c[500],d[500];
    memset(c,0,sizeof(c));
    memset(d,0,sizeof(d));
    int k,i=1,j=1,n,m;
    n=strlen(a);
    m=strlen(b);
    //逆置存储在整形数组
    for(k=n-1; k>=0; k--)
        c[i++]=a[k]-'0';
    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=k+1;
    //重新转换为字符数组
    j=0;
    for(i=k; i>=1; i--)
        ans[t][j++]=c[i]+'0';

}
int main()
{
    memset(ans,'',sizeof(ans));
    int i,n;
    ans[1][0]='1';
    ans[2][0]='1';
    for(i=3; i<=1000; i++)
    {
        plus(ans[i-1],ans[i-2],i);
    }
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        printf("%s
",ans[n]);
    }

}
原文地址:https://www.cnblogs.com/orchidzjl/p/4286924.html