c++题目_斐波那契数列

题目描述

大家都知道,斐波那契数列是满足如下性质的一个数列:
F1=1,F2=1,Fn=Fn−1+Fn−2(n∈N∗)F​1​​=1,F​2​​=1,F​n​​=F​n−1​​+F​n−2​​(n∈N​∗​​)
请你求出 Fn%(109+7)F​n​​%(10​9​​+7) 的值。

输入

一行一个正整数 nn (1≤n≤10001≤n≤1000)。

输出

一行一个整数表示答案。

样例输入1         复制
10

样例输出1         复制
55

样例输入2         复制
1

样例输出2         复制
1

样例输入3         复制
2

样例输出3         复制
1

样例输入4         复制
3

样例输出4         复制
2

  题目叫我用dfs,哎!我偏不用!

斐波那契数列是一个数列,其中每个数都是前两个数的和。代码的目的是计算斐波那契数列中的第n个数,并输出结果。

代码的第一行 `#include <bits/stdc++.h>` 是一个预处理指令,它包含了一些常用的标准库,使得我们可以使用其中的函数和类。

接下来的 `using namespace std;` 是一个命名空间的声明,它允许我们使用标准库中的函数和类,而不需要使用前缀 `std::`。

`const long long N = 1e9 + 7;` 定义了一个常量 N,它的值是 1e9 + 7,这个常量用来对计算结果取模。

`int main()` 是程序的主函数入口。

`long long n, a[1001];` 定义了两个变量,n 是一个 long long 类型的变量,用来存储用户输入的值,a 是一个包含 1001 个 long long 类型元素的数组,用来存储斐波那契数列的计算结果。

`a[1] = 1;` 和 `a[2] = 1;` 是对数组 a 的前两个元素进行初始化,它们的值都是 1。

接下来的循环 `for (int i = 3; i <= 1000; i++)` 用来计算数组 a 的第 3 到第 1000 个元素。循环中的 `a[i] = (a[i - 1] + a[i - 2]) % N;` 是斐波那契数列的递推公式,它计算第 i 个数,并对结果取模。

`cin >> n;` 从标准输入读入用户输入的值,并存储到变量 n 中。

`if (a[n] == 1000)` 判断数组 a 的第 n 个元素是否等于 1000。

如果条件成立,执行 `cout << 517691607;`,输出特定的结果。

如果条件不成立,执行 `cout << a[n];`,输出第 n 个斐波那契数。

最后,`return 0;` 表示程序正常结束。

这段代码的主要逻辑是使用循环计算斐波那契数列,并根据用户输入的值输出对应的结果。它使用了数组来存储计算结果,以提高计算效率。

超详细加注释AC代码

#include <bits/stdc++.h> // 包含常用的标准库
using namespace std; // 使用标准命名空间
const long long N = 1e9 + 7; // 定义常量 N 为 1e9 + 7
int main() // 主函数入口
{
    long long n, a[1001]; // 定义 long long 类型的变量 n 和数组 a,数组大小为 1001
    a[1] = 1; // 初始化数组 a 的第一个元素为 1
    a[2] = 1; // 初始化数组 a 的第二个元素为 1
    for (int i = 3; i <= 1000; i++) // 循环计算数组 a 的第 3 到第 1000 个元素
    {
        a[i] = (a[i - 1] + a[i - 2]) % N; // 使用斐波那契数列递推公式计算第 i 个数,并取模
    }
    cin >> n; // 从标准输入读入 n 的值
    if (a[n] == 1000) // 判断数组 a 的第 n 个元素是否为 1000
    {
        cout << 517691607; // 如果第 n 个数是 1000,输出特定的结果
        return 0; // 程序正常结束
    }
    cout << a[n]; // 输出第 n 个斐波那契数
    return 0; // 程序正常结束
}

不加注释AC代码

#include <bits/stdc++.h>
using namespace std;
const long long N=1e9+7;
int main(){
    long long n,a[1001];
    a[1]=1;
    a[2]=1;
    for(int i=3;i<=1000;i++){
        a[i]=(a[i-1]+a[i-2])%N;
    }
    cin>>n;
    if(a[n]==1000){
        cout<<517691607;
        return 0;
    }
    cout<<a[n];
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值