您的位置:首页 > 其它

大菲波数 hdu 1715

2016-11-23 19:38 267 查看
O - 大菲波数
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d
& %I64u
Submit Status

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

思路:斐波那契数列我们很熟悉,但是第1000个菲波数,百度了一下大约二百多位?所以我们就要使用字符来存,
开一个二维数组,s[i][j] i表示第几个数,j存储每一个菲波数,然后就是高精度的大数相加,这里跟着我的巨巨们学了个
新方法,我们以前采用数组或者字符来存只存一位(0-9的数字)这时候我们对应的是十进制满10就要进位,这里我们可以
将int的二维数组变成10^8方进制,也就是满10^8进位,然后最后输出就八位八位输出,第一个八位我们要判断是否有0,
后面的八位八位数除以就要注意不要丢失前导0的情况;
#include<stdio.h>
#define MAX 100000000
int s[1002][510]={0};
int main()
{  int n,x;
   int i,j,tem,t=1;
   s[1][0]=1;
   s[2][0]=1;
   for(i=3;i<=1000;i++){
   
 tem=0;
   
 for(j=0;j<t;j++)
   
 {   s[i][j]=s[i-1][j]+s[i-2][j]+tem;
   
     if(s[i][j]>=MAX)
   
     {  tem=s[i][j]/MAX;
   
        s[i][j]%=MAX;
}
else
tem=0;
 }
  if(tem)
  {  s[i][t]=tem;
       t++;//t来控制位数,有进位下次遍历就需要多一位遍历;
  }
     }
   
  scanf("%d",&n);
  while(n--){ 
     scanf("%d",&x);
     int i=100;
     while(s[x][i]==0)
        i--;
     printf("%d",s[x][i--]);
     for(int j=i;j>=0;j--)
      printf("%08d",s[x][j]);
 
 printf("\n"); 
  }
  return 0;  
}

#include<stdio.h>

#include<string>

using namespace std;

int s[1002][510]={0};

int main()

{  int n,x;

   int i,j,tem,t=1;

   s[1][0]=1;

   s[2][0]=1;

   for(i=3;i<=1000;i++){

     tem=0;

     for(j=0;j<t;j++)

     {   s[i][j]=s[i-1][j]+s[i-2][j]+tem;

         if(s[i][j]>=10)

         {  tem=s[i][j]/10;

            s[i][j]%=10;
}
else
tem=0;
 }
  if(tem)
  {  s[i][t]=tem;
       t++;//t来控制位数,有进位下次遍历就需要多一位遍历;
  }
     }
   
  scanf("%d",&n);
  while(n--){ 
     scanf("%d",&x);
     int i=500;
     while(s[x][i]==0)
        i--;
     for(int j=i;j>=0;j--)
     printf("%d",s[x][j]);
 
 printf("\n"); 
  }
  return 0;  
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm