HDU 1568 犀利的fibonacci数列(log 科学记数法)
2017-01-16 17:04
253 查看
思路:
1)前20项没超过10000,直接递推出2)首先我们知道fibonacci的通项公式:
然而这个得出来的数太大了。。。
有一种很巧妙的思路:
我们想要求出某个很大的数的前几位,比如求斐波那契数列第40项102334155的前6位,我们可以把102334155化成1.02334155*10^8,然后把1.02334155这个数乘100000取整就可以了。这种方法可以求一个数的前任何位。
所以先对fn取对数,去掉整数部分(这里的整数部分是之后的幂所以去掉也不会影响结果)然后去其小数部分,得到temp,然后需要几位就去取ans = pow ( 10,temp )的几位小数就行了。
#include <iostream> #include <cstdio> #include <string.h> #include <cmath> typedef long long int li; using namespace std; int f[25]; int main(){ int n; f[0] = 0; f[1] = f[2] = 1; for(int i = 3;i<=23;i++){ f[i] = f[i-1] + f[i-2]; } while(~scanf("%d",&n)){ if(n < 21) printf("%d\n",f ); else{ double gw = sqrt(5); double temp = log10(1.0/gw) + n * log10((1+gw)/2.0); temp = temp - (int)temp; double ans = pow(10,temp); while(ans < 1000) ans *= 10; printf("%d\n",(int)ans); } } }
相关文章推荐
- hdu 1568 (log取对数 / Fib数通项公式)
- HDU 1568 犀利的斐波那契
- 【HDU】-1568-Fibonacci(公式+log取小数)
- hdu 1568 (log取对数 / Fib数通项公式)
- [hdu 1568] Fibonacci数列前4位
- hdu 1568 (log取对数 / Fib数通项公式)
- hdu 1568 (log取对数 / Fib数通项公式)
- HDU 1060 求N ^ N 的第一位数字 用log 降低位数
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- hdu 3977 Evil teacher 求fibonacci数列的循环节
- hdu 1568 Fibonacci
- hdu 1568 fibonacci
- hdu 1568 Fibonacci
- hdu 5451 Best Solver 快速矩阵乘法 Fibonacci数列的循环节
- [斐波那契前n位 数学技巧] HDU 1568 Fibonacci
- hdu 1568 Fibonacci 斐波那契通项公式求对数
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- 数论(fabonacci数列) hdu-1568-Fibonacci