高精度问题
高精度
洛谷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++;
}
- 第一个循环先按位相加
- 第二个循环判断每一位是否大于10,如果大于10,进位
re[now][i+1] += re[now][i]/10;
,然后剩下个位re[now][i] %= 10;
- 由于高位存储于下标高的数组中,所以需要反向循环输出
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];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现