一道有道编程题

本文探讨了一种名为‘辛波那切数列’的序列计算方法及其优化,通过转换为Fibonacci数列的形式进行高效计算,并提供了具体的代码实现,解决了精度损失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  描述

菲波那切数列可以用下列的式子表示:
f(1)=1
f(2)=1
f(n)=f(n-1)+f(n-2) (n>=3)

现在我们根据这个规则定义另一种数列 命名为"辛波那切数列", 它是这样定义的:
s(x)=0 (x<0)
s(x)=1 (0<=x<1)
s(x)=s(x-1)+s(x-3.14) (x>=1)

现在需要计算出s(x) MOD 1000000007的值。

输入

第一行有一个正整数T表示有T组测试数据。
接下来T行,每行包含一个数x。
其中 T<=10000, -1000.0<=x<=1000.0

输出

有T行,依次输出每组数据的结果。

  样例输入 3
-1
0.667
3.15
样例输出 0
1
2  要求 时间限制 1000ms 内存限制 65536kb

我的分析

      采用简单的递归的方法在做这题时间上肯定会超时,因而只有分析下,有没有其它的办法。

      经过分析,看能否转换为fibonacci数的问题:

      当x<-[1,3.14)时,s(x)=s(x-1)=...=1,s(x-3.14)=0;--------s(x)=1;

      当x<-[3.14,4.14)时,x-1<-[2.14,3.14),s(x-1) = 1,s(x-3.14)=1-------s(x)=2;

      当x<-[4.14,5.14)时,x-1<-[3.14,4.14) ,s(x-1) =2 ,x-3.14<-[1,2),s(x-3.14)=1;------s(x)=3;

      当x<-[5.14,6.14)时,x-1<-[4.14,5.14),s(x-1)=3,x-3.14<-[2,3),s(x-3.14)=1;---------s(x)=4;

      当x<-[6.14,7.14)时,x-1<-[5.14,6.14),s(x-1)=4,x-3.14<-[3,4),...此时s(x-3.14)的值不定,分析就此截止

     说明x-1与x-3.14不是正好落在分别前两个区间,故其函数值也不能用前两个区间的函数值之和来计算;美好的想法只能落空。

网友的分析

以下引用http://topic.youkuaiyun.com/u/20100524/22/c3ff1e6d-8d2d-42f4-a982-cddf7ab77528.html网友的分析和代码

12楼:danjiewu

条件-1000.0<=x<=1000.0很关键,其实要把3.14当作整数来看待,也就是s(x)=s(x-100)+s(x-314),-100000<=x<=100000,这样就好办了,直接把所有结果都计算出来就可以了。当然还要考虑到精度损失的问题,这个倒卡了好久。

danjiewu的代码:

 

6楼knate

 

 

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值