AOJ-AHU-OJ-394 Fibonacci numbers

本文介绍了一种高效计算斐波那契数列的方法,利用其周期性特点进行模10000运算,避免了直接计算带来的巨大数值问题。通过优化算法,实现了对任意指定位置的斐波那契数进行快速求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fibonacci numbers
Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB
 
Description
斐波那契数列应该是世界上最美的数列了,但是要是不算出它的前100000000项你就体会不到它的美丽,我们现在就要算出第N个Fibonacci数是多少

 

Input
输入包括多组数据,每行一个整数N(1 =< N <= 10^9),输入以0结束

 

Output
对应每组输出,请输出第N个Fibonacci数列的值,因为它可能非常大,输出它mod 10000的值

 

Sample Input
OriginalTransformed


4
63
12
78
0

 

Sample Output
OriginalTransformed


3
9842
144
1464

 

Source
Large的高精度 NO.1
 
——————————————————————分割线——————————————————————
 
思路:刚开始的时候,天真的开了一个十亿的数组,在函数外。但是很明显的,不允许。后来询问道,取模10000是个要点。斐波那契数列的尾数是有规律的。规律如下:
 斐波那契数列的最后两位数是一个300步的循环,最后三位数是一个1500步的循环,最后四位数是一个15000步的循环,最后五位数是一个150000步的循环
每15000项有一个循环 
 
代码如下:

 1 #include <stdio.h>
 2 int f[15000];
 3 int main(){
 4     f[0] = 1;
 5     f[1] = 1;
 6     int n, i;
 7     for(i = 2; i < 20; i++)
 8       f[i] = f[i-1] + f[i-2];
 9     for(i = 20; i < 15000; i++)    
10       f[i] = (f[i-1] + f[i-2]) % 10000;
11     while(scanf("%d", &n) != EOF&&n){
12         n--;
13           printf("%d\n", f[n%15000]);        
14     }
15     return 0;
16 }

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值