斐波那契大数
NYOJ655
在整形的范围内,斐波纳契数只能计算到第40多个,所以要转换到数组里面存放每一个斐波纳契数数的每一位,使用二位数组的方式是比较好的,行下标代表第几个斐波那契数,列下表里面存放斐波那契数的每一位。
原理:大数相加
根据斐波那契数的性质
从后往前来计算每一行的每一列的值。(因此,输出时,先找到那一行中第一个不为0的下标,然后依次输出。)
sum = Fib[i - 1][j] + Fib[i - 2][j] + Fib[i][j]
Fib[i][j] = sum % 10;
NYOJ655
在整形的范围内,斐波纳契数只能计算到第40多个,所以要转换到数组里面存放每一个斐波纳契数数的每一位,使用二位数组的方式是比较好的,行下标代表第几个斐波那契数,列下表里面存放斐波那契数的每一位。
原理:大数相加
根据斐波那契数的性质
从后往前来计算每一行的每一列的值。(因此,输出时,先找到那一行中第一个不为0的下标,然后依次输出。)
sum = Fib[i - 1][j] + Fib[i - 2][j] + Fib[i][j]
Fib[i][j] = sum % 10;
Fib[i][j - 1] += sum / 10;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 205
int fib[MAX][MAX];
char str[200];
void init()
{
fib[0][MAX - 1] = 1;
fib[1][MAX - 1] = 1;
int i, j;
for(int i = 2; i < MAX; i++)
{
for(int j = MAX - 1; j >= 0; j--)
{
int sum = 0;
sum = fib[i][j] + fib[i - 1][j] + fib[i - 2][j];
fib[i][j] = sum % 10;
fib[i][j - 1] += sum / 10;//+=
}
}
/* for(int i = 0; i < 200; i++)
{
for(j = 0; j < MAX; j++)
{
if(fib[i][j] != 0)
break;
}
for(int k = j; k < MAX; k++)
printf("%d", fib[i][k]);
printf("\n");
}*/
}
int main()
{
init();
int n;
scanf("%d", &n);
while(n--)
{
scanf("%s", str);
int len = strlen(str);
int j;
for(j = 0; j < MAX; j++)
{
if(fib[len][j] != 0)
break;
}
for(int k = j; k < MAX; k++)
printf("%d", fib[len][k]);
printf("\n");
}
return 0;
}