斐波那契数列除以10007的余数C语言,C语言之不一样的斐波那契数列
图片发自简书App
问题描述
Fibonacci数列的递推公式为:F(n)=F(n-1)+F(n-2),其中F(1)=F(2)=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
默认规定:
1<= n <=1000000
分析一
根据斐波那契递推公式可以写出递归函数,求出F(n)对10007取余即可。
int fibon(int n)
{
if(n<=2)
return 1;
else
return fibon(n-1) + fibon(n-2);
}
挺简单的,直接调用试一下:
int main()
{
int n;
scanf("%d", &n);
printf("%d", fibon(n)%10007);
return 0;
}
结果在快写代码中测试,在第四项以后都超时。。。
图片发自简书App
分析二
上面求斐波那契数列用的是递归,由于递归有重复操作可能耗时比较长,导致测试超时。
将递归修改成循环会不会不超时呢?
int fibon(int n)
{
int fn = 1, fn1 = 1, fn2 = 1;
if(n>2)
{
for(int i=2; i
{
fn = fn1 + fn2;
fn2 = fn1;
fn1 = fn;
}
}
return fn;
}
主函数调用方法同上,不再重复,结果。。。测试项4之后未通过。。。
图片发自简书App
分析三
测试上面代码,再加上n的大小规定,猜想可能是int的范围不够大,所以将代码中int替换为double。
#include
#include
double fibon(int n)
{
double fn = 1, fn1 = 1, fn2 = 1;
if(n>2)
{
for(int i=2; i
{
fn = fn1 + fn2;
fn2 = fn1;
fn1 = fn;
}
}
return fn;
}
int main()
{
int n;
scanf("%d", &n);
double sha = floor(fibon(n)/10007);
printf("%.0lf", fibon(n)-sha*10007);
return 0;
}
结果比上面好一点,不过还是有通不过的。。。
图片发自简书App
分析四
本题最终结果是求余数,fn的结果10007001和1是一样的,所以最终应该改造斐波那契数列的求值。
int fibon(int n, int yu)
{
int fn = 1, fn1 = 1, fn2 = 1;
if(n>2)
{
for(int i=2; i
{
fn = (fn1 + fn2)%yu;
fn2 = fn1;
fn1 = fn;
}
}
return fn;
}
调用也相对简单:
int main()
{
int n;
scanf("%d", &n);
printf("%d", fibon(n, 10007));
return 0;
}
结果自然是通过,100分!
图片发自简书App
总结
题目其实描述的挺清楚的:
fn比较大、n的取值范围比较大
其实可以猜测普通的暴力求解是解不出来的。
工具分享
斐波那契数列除以10007的余数C语言,C语言之不一样的斐波那契数列相关推荐
- 蓝桥杯算法:斐波那契求Fn除以10007的余数
时间限制: 1.0s 内存限制: 512.0MB [问题描述] Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以 ...
- Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。(python)
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1.当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 刚开始做 def svd(n):if(n ...
- Fn除以10007的余数是多少
1/24 问题: 头文件声明 输入输出 int main return 0 #define printf scanf & for.函数里不能声明变量 问题描述 Fibonacci数列的递推 ...
- 斐波那契数列除10007求余数
题目: 分析: ①采用递归或者递推的方法写出斐波那契数列,从而方便得出余数. ②斐波那契数列从第三项开始,每项都是前两项之和. 即Fib(n)=Fib(n-1)+Fib(n-2) (N>=3) ...
- python斐波那契数列前20项_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈
本文来自公众号:超级数学建模 微信号 :supermodeling 原文标题:斐波那契数列趣谈 via 善科 by BB 一般认为斐波那契数列的提出是基于兔子的繁殖问题:如果一开始有一对兔子,它们每月 ...
- 不许用%和/来实现求任意数除以3的余数
转载请注明出处,声明如下: 作者:peizhongyou 前几天参加一个编程竞赛,涉及到部分位运算的知识,准备不足挂了.事后在网上搜了一下位运算的介绍看到<位运算之美>这篇博客,其中提到了 ...
- 数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和
/** 数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. 输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义 ...
- 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。(java)
数列的定义如下: 数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和. 输入数据有多组,每组占一行,由两个整数n(n<10000)和m(m<1000)组成,n和m的含义如前所述 ...
- 1051: 平方根的和 数列的定义如下: 数列的第一项为item,以后各项为前一项的平方根,求数列的前n项的和。
C++ 数列的定义如下: 数列的第一项为item,以后各项为前一项的平方根,求数列的前n项的和. #include<iostream> using namespace std; #incl ...
最新文章
- 总结:DCIC算法分析赛完整方案分享!
- jpa执行mysql存储过程_基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合...
- 前端学习(2585):前端怎么在响应头和请求头里面拿数据?
- 微服务、Kubernetes和无服务器之后,即将发生的……
- linux mint下安装vnc,VNC远程连接Linux mint桌面
- Android投屏利器vysor
- linux之正则匹配命令学习笔记
- 记录一下我的蓝牙遥控小车
- 【计算机网络】传输层 : 传输层概述 ( 设备层级 | 传输层功能 | TCP 协议 | UDP 协议 | 复用与分用 | 端口号 | 套接字 )
- P1359 租用游艇
- 前端面试题,速看webP,把握住网页提速小细节!亲测可用!
- exter与static的用法
- antd自定义样式主题
- 欧拉是如何计算圆周率的
- P2905 [USACO08OPEN]农场危机Crisis on the Farm-dp
- android 360加固保
- 超级无敌qmail安装大法,详尽之极
- ebay架构师总结伸缩性要旨!!
- php mysql utf 8_PHP+MySQL中对UTF-8,UTF8(utf8),set names gbk 的理解
- 有隔板高效过滤器和无隔板高效过滤器区别在哪里