我必须编写一个程序,我将获得第n个术语的最后三位数字。例如,第20个术语是6765,后三个数字是'765'。现在我需要找到Fibonacci序列的第一个数字,其最后三位数为“321”。
我在网上查了一下,发现第n个术语是479,而我写的程序甚至不能那么高。我找不到任何程序高于第100学期的人。
截至目前,他们无法找到高于100的字词? 除了递归之外你还有其他任何想法,找到以'321'结尾的数字的第一个数字?
我的递归代码非常基本:
long long fibNum(long long nth)
{
if (nth == 1)
return 1;
else if (nth == 2)
return 1;
else
return fibNum(nth - 1) + fibNum(nth - 2);
}
当我到第43个学期时,它开始减速。
答案 0 :(得分:6)
第479号是 5696323922575865414847061494575945648081290145228607189038829076215134884313127297923138542545712321
即使在很长的长变量中也不适合。我建议你只考虑数字的最低部分来实现它。您不需要存储完整的数字只是为了计算最后3位数,然后估计整数。
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define PHI 1.61803399
int main(int argc, char *argv[]){
int pos;
int x = 0, y = 1, tmp = 0;
long double num=0;
int searched = atoi(argv[1]);
printf("Looking for a fibonacci number ending with: %03d\n", searched);
for(pos = 2; y != searched; pos++){
tmp = x+y;
x = y;
y = tmp%1000;
}
pos--;
printf("Found at position: %d\n", pos);
num = (powl(PHI, pos) - powl(1-PHI, pos))/sqrt(5);
printf("Approximated number %Le\n", num);
while(num >= 10) num /= 10;
printf("First digit: %d\n", (int)num);
return 0;
}
输出:
> ./finbonacci 321
Looking for a fibonacci number ending with: 321
Found at position: 479
Approximated number 5.696326e+99
First digit: 5
此代码首先计算我们在序列中寻找的数字的位置,而不是使用可以接近斐波纳契数列的第n个数的Binet's formula。由于我们只需要第一个数字,我们可以容忍近似误差。