hdu1568斐波那契前4位

题意:
     就是求斐波那契数,但是只要求输出前四位,(n<=100000000)。
思路:
     这个要用到斐波那契的公式和一些log的规律,直接打看着很乱,直接在网上偷张图片吧:     
然后就是一些log的性质
log10(a^b) = b * log10(a),log10(a*b) = log10(a) + log10(b)
我们可以根据这个把大数的前几位拿出来,这样:
log10(1234567890) 
= log10(1.234567890 * 10^9) 
= log10(1.234567890) + 9
这样我们就得到了一个"小数部分"bit = log10(1.234567890)
然后pow(10.0 ,bit) = 1.234567890

这样我们就得到了一个大数的科学技术法的前边部分,想要四位,直接*1000取整就行了。

#include<stdio.h>
#include<math.h>

int num[25];
void ini()
{
   num[0] = 0 ,num[1] = 1;
   for(int i = 2 ;i <= 20 ;i ++)
   num[i] = num[i-1] + num[i-2];

}
     
int main ()
{
    ini();
    int n;
    while(~scanf("%d" ,&n))
    {
       if(n <= 20) 
       {
          printf("%d\n" ,num[n]);
          continue;
       }
       double now = -0.5 * log10 (5.0) + n * 1.0 * log10((1+sqrt(5.0))/2.0);
       double bit = now - (int)now;
       double a = pow(10.0,bit);
       a *= 1000;
       printf("%d\n" ,int(a));
    }
    return 0;
}
    



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值