大菲波数 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
Sample Output
思路:斐波那契数列我们很熟悉,但是第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;
}
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;
}
相关文章推荐
- hdu 1715 大菲波数
- hdu 1715 大菲波数
- hdu 1715 大菲波数(高精度数)
- hdu-1715大菲波数
- hdu 1715 大菲波数(高精度数)
- HDU 1715 大菲波数
- hdu 1715 大菲波数
- hdu 1715 大菲波数(大数相加)
- HDOJ HDU 1715 大菲波数 ACM 1715 IN HDU
- hdu 1715 大菲波数
- HDU 1715 大菲波数(JAVA, 简单题,大数)
- hdu 1715 大菲波数
- hdu 1715 大菲波数
- HDU 1715 大菲波数
- hdu1715 大菲波数 C++ 大数类模板
- HDU 1715 大菲波数 大数
- HDU 1715 大菲波数
- HDU_1715 大菲波数(高精度)
- hdu 1715 大菲波数
- HDU 1715 大菲波数