算法分析与设计课堂实验(5 分支策略3

问题描述】

在Fibonacci数列中,

。例如,Fibonacci数列的前十项是:

0,1,1,2,3,5,8,13,21,34,…

Fibonacci序列的另一个公式是

给定一个整数

,请你计算

在10进制表示下的最后四位。

【输入形式】

输入将包含一个测试用例。每个测试用例仅有一行,包含一个整数

(其中

)。

【输出形式】

对于每个测试用例,输出

的最后四位数字。如果

的最后四位都是零,则输出

;否则,省略任何前导零(即,输出

)。

【样例输入】

0
【样例输出】

0
样例输入】

9
【样例输出】

34

#include <iostream>
#include <string>
using namespace std;
 
const int MOD = 10000;
 
pair<int, int> fast_doubling(int n) {
    if (n == 0) {
        return {0, 1};
    }
    auto [a, b] = fast_doubling(n >> 1);
    int c = (a * (( (2 * b - a) % MOD + MOD ) % MOD )) % MOD;
    int d = ( (a * a % MOD) + (b * b % MOD) ) % MOD;
    if (n & 1) {
        return {d % MOD, (c + d) % MOD};
    } else {
        return {c % MOD, d % MOD};
    }
}
 
int main() {
    int n;
    cin >> n;
    if (n == 0) {
        cout << 0 << endl;
        return 0;
    }
    auto [fib_n, fib_n1] = fast_doubling(n);
    int res = fib_n;
    char buffer[5];
    sprintf(buffer, "%04d", res);
    string s(buffer);
    size_t start = s.find_first_not_of('0');
    if (start == string::npos) {
        cout << 0 << endl;
    } else {
        cout << s.substr(start) << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值