hdu 1568(Fibonacci)(就是大数的斐波那契公式)

Fibonacci

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 3569    Accepted Submission(s): 1627

Problem Description

2007年到来了。经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列

(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。

接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。

Input

输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。

Output

输出f[n]的前4个数字(若不足4个数字,就全部输出)。

Sample Input

0
1
2
3
4
5
35
36
37
38
39
40

Sample Output

0
1
1
2
3
5
9227
1493
2415
3908
6324
1023

Author

daringQQ

Source

Happy 2007

斐波那契的公式,求解过程,可以利用公式先求出其小数部分,然后求其的次方,得到的数值,进行乘十运算,直到变成四位数

代码如下:

</pre><pre name="code" class="cpp">//斐波那契数列公式:F(n)=[((1+sqrt(5.0)/2)^n-((1-sqrt(5.0))/2)^n]/sqrt(5.0);
//求大数的前几位数字,可以用公式,先求出小数部分,然后进行
//由于(1-sqrt(5.0))/2的N次方非常小,所以可以忽略。
#include<stdio.h>
#include<math.h>
int fib[22];
int main()
{
	double num;
	int n,f,i;
	fib[0]=0;
	fib[1]=1;
	for(i=2;i<=20;i++)
	fib[i]=fib[i-1]+fib[i-2];
	while(~scanf("%d",&n))
	{
		if(n<21)//由于小于20的斐波那契数列小于四位数字,所以可以直接输出。
		{
			printf("%d\n",fib[n]);
			continue;
		}
		num=n*(log10((1+sqrt(5.0))/2.0))-log10(sqrt(5.0));
		num-=(int)num;//得到小数部分
		num=pow(10,num);//得到第一位数
		while(num<1000)
		num*=10;
		f=num;//得到最后的四位数,消除小数部分
		printf("%d\n",f);
	}
	return 0;
}
时间: 2024-10-12 05:50:18

hdu 1568(Fibonacci)(就是大数的斐波那契公式)的相关文章

HDU 1848 Fibonacci again and again (斐波那契博弈SG函数)

Fibonacci again and again Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(n-2)(n>=3); 所以,1,2,3,5,8,13……就是菲波那契数列. 在

hdu 1316 How many Fibs?(高精度斐波那契数)

//  大数继续 Problem Description Recall the definition of the Fibonacci numbers: f1 := 1 f2 := 2 fn := fn-1 + fn-2 (n >= 3) Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a, b]. Input The input contains several test cas

HDU 4639 Hehe(字符串处理,斐波纳契数列,找规律)

题目 //每次for循环的时候总是会忘记最后一段,真是白痴.... //连续的he的个数 种数 //0 1 //1 1 //2 2 //3 3 //4 5 //5 8 //…… …… //斐波纳契数列 //不连续的就用相乘(组合数)好了 #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include &l

hdu1316(大数的斐波那契数)

题目信息:求两个大数之间的斐波那契数的个数(C++/JAVA) http://acm.hdu.edu.cn/showproblem.php?pid=1316 这里给出java代码和c++代码 C++:AC代码 #include<iostream> #include<string> using namespace std; string add(string s1,string s2){//字符串模拟大数加法 string s; int len1,len2; len1=s1.size

HDU 2516 取石子游戏 (斐波那契博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出"First win". Input输入有多组.每组第1行是2<=n<2^31. n=0退出. Output先取者负输出"Second win". 先取者胜输

HDU 5914 Triangle(打表——斐波那契数的应用)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5914 Problem Description Mr. Frog has n sticks, whose lengths are 1,2, 3?n respectively. Wallice is a bad man, so he does not want Mr. Frog to form a triangle with three of the sticks here. He decides t

题解报告:hdu 2516 取石子游戏(斐波那契博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出"First win". Input 输入有多组.每组第1行是2<=n<2^31. n=0退出. Output 先取者负输出"S

【TOJ 3600】Fibonacci II (对数+斐波那契通项式)

描述 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来.接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了.所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住.于是他决定编写一个程序来测验zouyu说的是否正确. 输入 输入若干数字n(0 <= n <=

nyoj655 光棍的yy(大数的斐波那契数)

题目655 题目信息 运行结果 本题排行 讨论区 光棍的yy 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 yy经常遇见一个奇怪的事情,每当他看时间的时候总会看见11:11,这个很纠结啊. 现在给你m个1,你可以把2个1组合成一个2,这样就不是光棍了,问这样的组合有多少种?? 例如(111  可以拆分为 111 12 21  有三种) 输入 第一行输入一个n表示有n个测试数据 以下n行,每行输入m个1 (1 <= n,m <= 200) 输出 输出这种组合种数,