编程之美-快速费波拉契数列

写出来也被它的速度吓了一跳,程序最坑的地方应该就是防止溢出了。

#include <stdio.h>
#include <stdlib.h>
#define MOD (19999997)
struct matrix
{
	unsigned long long a;
	unsigned long long b;        //{a,b}
	unsigned long long c;        //{c,d}
	unsigned long long d;
};
struct matrix mul_matrix(struct matrix a,struct matrix b) //return a*b
{
	struct matrix temp;
	temp.a=(a.a*b.a+a.b*b.c)%MOD;
	temp.b=(a.c*b.a+a.d*b.b)%MOD;
	temp.c=(a.a*b.b+a.b*b.d)%MOD;
	temp.d=(a.c*b.b+a.d*b.d)%MOD;
	return temp;
}
struct matrix pow_matrix(struct matrix ori)
{
	return mul_matrix(ori,ori);
}
int main(int argc, char*argv[])
{
    unsigned long max=atoi(argv[1]);
	struct matrix ms[32]; //pow(M,n)
	int i=1;
	ms[0].a=0;
	ms[0].b=1;
	ms[0].c=1;
	ms[0].d=1;
	for(i=1;i<32;i++) ms[i]=pow_matrix(ms[i-1]);

	struct matrix answer;
	answer.a=1;answer.b=0;answer.c=0;answer.d=1;// E matrix

	i=0;
	while(max)
	{
		if(max&0x01) answer=mul_matrix(answer,ms[i]);
		i++;
		max>>=1;
	}
	printf("%lld\n",(answer.d)%MOD);
	return 0;

}
时间: 2024-10-17 16:51:56

编程之美-快速费波拉契数列的相关文章

斐波拉契数列的快速求法

由斐波拉契数列的公式:f(n)=f(n-1)+f(n-2),如果使用递归方法,非常的简短易懂,但是重复计算太多,时间复杂度成指数形势增长. 由矩阵乘法可以得到: 又 于是有 剩下的就是计算矩阵的过程了. 斐波拉契数列的快速求法

斐波拉契数列的计算方法

面试题9.斐波拉契数列 题目: 输入整数n,求斐波拉契数列第n个数. 思路: 一.递归式算法: 利用f(n) = f(n-1) + f(n-2)的特性来进行递归,代码如下: 代码: long long Fib(unsigned int n) { if(n<=0) return 0; if(n==1) return 1; return Fib(n-1) + Fib(n-2); } 缺陷: 当n比较大时递归非常慢,因为递归过程中存在很多重复计算. 二.改进思路: 应该采用非递归算法,保存之前的计算结

c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)

写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include<stdio.h> int fibonacci(int n) { int num1=1, num2=1, num3=0,i; if (n <= 2) { printf("斐波拉契数列的第%d项为:%d\n",n,num1); } else { for (i = 2; i <

菲波拉契数列(传统兔子问题)

题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 斐波那契数: 亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就

(c语法百题31)费波那契数列

知识点: 数组,for语句,if语句灵活运用 在for中用if控制每5个数换行一次 内容: 已知faibonacai(费波那契)数列的前几个数分别为1,1,2,3,5,8,13,……,编程求此数列的前n(n>=5)项. 输入说明: 一行一个整数n(>=5 and <=22) 输出说明: 每5格一行,不足5个的也占一行 输入样例: 5 输出样例 : 1 1 2 3 5 #include <stdio.h> int main() { int a[22],n,i; a[0]=1;

下一个斐波拉契数列

Write a program that takes input of integer N, followed by N more integers. For each integer, output the next fibonacci number after it. Fibonacci number: Any number that belongs to the fibonacci series. Constraints: Your program should run correctly

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

青蛙跳台阶问题-斐波拉契数列

题目1:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级.求总共有多少种跳法 首先我们考虑最简单的情况,加入只有1级台阶,那显然只有一种跳法,如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级:另外一种就是一次跳2级 现在我们来讨论一般情况.我们把n级台阶时的跳法看成是n的函数,记为f(n).当n>2时,第一次跳的时候就有两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1):另外一种选择是第一次跳2级,此时跳法数目等于后面剩下的

浅谈C#中的斐波拉契数列

突然对那些有趣的数学类知识感兴趣了,然后就简单研究了一下斐波拉契数列,看看它的有趣之处! 斐波拉契数列(Fibonacci Sequence),又称黄金分割数列,该数列由意大利的数学家列奥纳多·斐波那契发现的.这种数列指的是这样一个数列:0.1.1.2.3.5.8.13.21. 34.--在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*). 用C#实现斐波拉契数列的代码: Console.Write("请输入一个长