蓝桥杯基础练习详细解析(四)——Fibonacci费伯纳西数列(题目分析、代码实现、Python)

发布于:2024-03-28 ⋅ 阅读:(12) ⋅ 点赞:(0)

试题 基础练习 Fibonacci数列

提交此题   评测记录  

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式

输入包含一个整数n。

输出格式

输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入

10

样例输出

55

样例输入

22

样例输出

7704

数据规模与约定

1 <= n <= 1,000,000。

题目分析:

         这个题目实现并不难,但是如果使用递归算法,会超过递归的最大深度导致报错。使用for循环保存结果则会超时,我自己只能得90分。所以我在网上找到了新的解题思路:就是直接返回结果,不用进行临时保存结果,通过for循环控制fn的计算结果。

参考文章:蓝桥杯—入门训练—Fibonacci斐波那契数列(Python解法)_蓝桥杯fibonacci数列python-CSDN博客

具体实现如下:

def fibonacci():
    n=int(input())
    f1=1
    f2=1
    for i in range(3,n+1):
       f1,f2=f2%10007,(f1+f2)%10007 #直接返回结果
    print(f2)
fibonacci()

运行通过截图:

试题 基础练习 圆的面积

提交此题   评测记录  

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

给定圆的半径r,求圆的面积。

输入格式

输入包含一个整数r,表示圆的半径。

输出格式

输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。

说明:在本题中,输入是一个整数,但是输出是一个实数。

对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。

实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。

样例输入

4

样例输出

50.2654825

数据规模与约定

1 <= r <= 10000。

提示

本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4。

题目分析:

      题目中唯一的考点就是,在Python中对浮点数进行有效位数的保留。本次我使用的方法是:"%.7f" %result。表示对result结果保留七位有效数字。

具体实现如下:

def circle():
    r=float(input())
    pi=3.14159265358979323
    result=pi*(r**2)
    print("%.7f" %result)
circle()

运行通过截图:

试题 基础练习 序列求和

提交此题   评测记录  

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

求1+2+3+...+n的值。

输入格式

输入包括一个整数n。

输出格式

输出一行,包括一个整数,表示1+2+3+...+n的值。

样例输入

4

样例输出

10

样例输入

100

说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。

一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。

样例输出

5050

数据规模与约定

1 <= n <= 1,000,000,000。

说明:请注意这里的数据规模。

本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。

本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。

如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。

题目分析:

这个题目不能暴力破解,因为计算量太大会超时,所以这时我们就需要找规律,发现给出的数据是一个等差数列求和。所以我们直接使用等差数列求和公式计算即可,等差求和公式为:na1+n(n-1)d/2。因为首项为1,公差为1。即简化后公式为:n+n(n-1)/2。

补充:等比数列求和公式——a1(1-q^2)/(1-q)

具体实现如下:

def summation():
    n=int(input())
    result=0
    result=n+n*(n-1)/2 #等差数列求和公式
    print(int(result))
summation()

运行通过截图:

本文含有隐藏内容,请 开通VIP 后查看