高精度问题

高精度

洛谷P2437 蜜蜂路线

这题是一道简单的求斐波那契数列题,但由于题目所给数字比较大,所以需要用到高精度。

主要代码

void fun() {
    for(int i = 0; i <= length; i++) {
        re[now][i] = re[now-1][i] + re[now-2][i];
    }

    for(int i = 0; i <= length; i++) {
        if(re[now][i] >= 10) {
            re[now][i+1] += re[now][i]/10;
            re[now][i] %= 10;
        }
    }
    if(re[now][length+1]) length++;
    now++;
}
  1. 第一个循环先按位相加
  2. 第二个循环判断每一位是否大于10,如果大于10,进位re[now][i+1] += re[now][i]/10;,然后剩下个位re[now][i] %= 10;
  3. 由于高位存储于下标高的数组中,所以需要反向循环输出
    for(int i = length; i >= 0; i--) {
        cout << re[now-1][i];
    }

注意事项

  • 需要一个length作为已经记录的最高位,每次判断更高位是否有数增加最高位if(re[now][length+1]) length++;
  • 由于数组初始化为0,因此判断最高位方法正确
  • 如果两个数最高位不同,a的最高位大于b,之前已经有了最高位的更新if(re[now][length+1]) length++;所以a的最高位为length或length+1,a+b最高位同样如此

完整代码如下

#include <bits/stdc++.h>
using namespace std;

int re[1000][1000] = {0};
int now = 0, length = 0;

void fun() {
    for(int i = 0; i <= length; i++) {
        re[now][i] = re[now-1][i] + re[now-2][i];
    }

    for(int i = 0; i <= length; i++) {
        if(re[now][i] >= 10) {
            re[now][i+1] += re[now][i]/10;
            re[now][i] %= 10;
        }
    }
    if(re[now][length+1]) length++;
    now++;
}

int main() {
    int m, n;
    cin >> m >> n;
    n = n-m+1;
    m = 1;
    re[1][0] = 1;
    re[2][0] = 1;
    now = 3;
    for(int i = 3; i <= n; i++) {
        fun();
    }
    for(int i = length; i >= 0; i--) {
        cout << re[now-1][i];
    }
}
posted @   若把你比作歌  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示