【hautoj 1286】czl的复仇计划 【 斐波那契通项公式+求大数的前n位】

还记得上次czl给ykc做苦力的事情了吗,czl越想越气,于是决定报复一下ykc,可他知道ykc是不会轻易上当的,呢该怎么办呢,咦……有了,“嗨,ykc,我最近爱上了编程,可是遇到了一个难题,想了一晚上都没有任何思路,是关于斐波那契的,能请教一下你吗?”,“啊,斐波那契呀,呢不是so easy嘛。”ykc自信的说道,czl内心已经开始窃喜了,“既然你这么自信,呢要是你不能帮我解决,就要给我买好吃的,我可想吃肉了。”czl咽了一下口水。“当然可以了,怎么可能有我解决不了的斐波那契”ykc不屑的说道,ykc果然上当了。。。。。czl面无表情的说道:“呢道题是这样描述的,给你一个整数n,让你求斐波那契数列的第n项的前5位和后5位。”“哈哈,看来你是吃不上肉了,递推一下,求一求啦。”ykc仍然自信的说道。“等等,我还没说完呢,n有100000000这么大”,czl补充道。“啊。。。。哦”,ykc感觉到自己被坑了,可是来不及了,眼看就要月底了,ykc早就没钱了,聪明的你能帮帮他吗?
(注意:假如该项的斐波那契数列总位数小于等于10位,呢就直接输出就好了,否则按照 前5位*后5位 的格式输出)。

以上全是扯淡,只用求前5位就好了(毕竟czl也不想刁难ykc)

输入

多组测试实例,每行一个整数n(n<=100000000)
输出

要求输出的第n项
样例输入

0
1
2
3
4
5
35
36
37
38
39
40
64
65
样例输出

0
1
1
2
3
5
92274
14930
24157
39088
63245
10233
10610

这里写图片描述
取完对数

这里写图片描述

我也就不对着标程扯了。看链接吧 相似的题目

一般的求一个数前n位的代码(肯定不会求太多位数,要不然精度不够求不出来) 记录一下吧
代码

double x,temp;
while(scanf("%lf",&x)!=EOF)
{
temp=log(x)/log(10.0);
temp=temp-floor(temp); //floor(temp)函数求出小于temp的最大整数
temp=pow(10.0,temp);
while(temp<1000)// 此处是四位
temp*=10;
//printf("%.0lf\n",temp); //采用浮点表达法时会四舍五入
printf("%d\n",(int)temp);//此处不需四舍五入,直接舍弃后面的位
}
}

此题 代码

#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = 1e2;
const int MAXM = 1e5;
LL f[55]={0,1,1,2};
int main(){
    for(int i=4;i<27;i++) {
        f[i]=f[i-1]+f[i-2];
    //printf("i== %d   %lld\n",i,f[i]);
    }
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n<=25) printf("%d\n",f[n]) ;
        else {
         double temp=-0.5*log(5.0)/log(10.0)+((double)n)*log((sqrt(5.0)+1.0)/2.0)/log(10.0);
         temp-=floor(temp);
         temp=pow(10.0,temp);
         while(temp<10000) temp*=10;
         printf("%d\n",(int)temp);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值