結果n = 5000時,數字根本超大,
心機啊……
像這題array這麼大的,不能設成區域變數,
要不然會stack overflow,
要用全域變數或malloc。
最後寫出來了,沒想到一直RE RE RE RE,
哇咧,原來費氏數列要從0開始,
難怪一直RE XD,
真蠢我也 orz。
/* ACM 495 Fibonacci Freeze
* mythnc
* 2011/11/07 11:53:16
* run time: 0.532
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXARY 1100
#define MAXN 5001
void init(int **);
void fibo(int **);
int bigadd(int *, int *, int *, int);
void printbig(int *);
void freen(int **);
int main(void)
{
int n;
int *number[MAXN];
init(number);
fibo(number);
while (scanf("%d", &n) == 1) {
printf("The Fibonacci number for %d is ", n);
printbig(number[n]);
}
freen(number);
return 0;
}
/* init: make space to n[i] and
* initialize content of n[i] to zero */
void init(int **n)
{
int i;
for (i = 0; i < MAXN; i++) {
n[i] = (int *)malloc(sizeof(int) * MAXARY);
memset(n[i], 0, sizeof(int) * MAXARY);
}
}
/* fibo: calculate fibonacci number from 0 to 5000 */
void fibo(int **n)
{
int i, digit;
n[0][0] = 0;
n[1][0] = digit = 1;
for (i = 2; i < MAXN; i++)
digit = bigadd(n[i], n[i - 1], n[i - 2], digit);
}
/* bigadd: big number addtion,
* return it's digits */
int bigadd(int *n, int *pre, int *ppre, int d)
{
int i;
for (i = 0; i < d; i++)
n[i] += pre[i] + ppre[i];
/* carry */
for (i = 0; i < d; i++)
if (n[i] > 9) {
n[i] %= 10;
n[i + 1]++;
}
if (n[i] != 0)
return i + 1;
return i;
}
/* printbig: print out big number */
void printbig(int *n)
{
int i;
i = MAXARY - 1;
while (n[i] == 0 && i > 0)
i--;
for (; i > -1; i--)
printf("%d", n[i]);
printf("\n");
}
void freen(int **n)
{
int i;
for (i = 0; i < MAXN; i++)
free(n[i]);
}
沒有留言:
張貼留言