当前位置: 首页 > news >正文

高精度运算

1.乘法

#include <bits/stdc++.h>
using namespace std;char s1[2000], s2[2000];
int a[2000], b[2000], c[4000];int main() {cin >> s1 >> s2;int ls1 = strlen(s1);int ls2 = strlen(s2);int ls3 = ls1 + ls2;// 将字符串 s1 和 s2 转换为数组 a 和 bfor (int i = 0; i < ls1; i++) {a[ls1 - i - 1] = s1[i] - '0';}for (int i = 0; i < ls2; i++) { // 注意这里是 ls2b[ls2 - i - 1] = s2[i] - '0';}// 计算乘法for (int i = 0; i < ls1; i++) {for (int j = 0; j < ls2; j++) {c[i + j] += a[i] * b[j];c[i + j + 1] += c[i + j] / 10; // 处理进位c[i + j] %= 10; // 取当前位的值}}// 去掉前导零while (ls3 > 0 && c[ls3 - 1] == 0) {ls3--;}// 输出结果for (int i = ls3 - 1; i >= 0; i--) {cout << c[i];}return 0;
}

2.1.除法,大除以小

//高精度除法
#include <bits/stdc++.h>using namespace std;char s[2000];
long long b,a[2000],c[2000],x,la,lc;int main()
{cin >> s >> b;la = strlen(s);for(int i = 1;i<=la;i++){a[i] = s[i-1] - '0';}for(int i = 1;i<=la;i++){c[i]=(x*10+a[i])/b;x=(x*10+a[i])%b;}lc = 1;while(c[lc]==0&&lc<=la){lc++;}for(int i = lc;i<=la;++i){cout << c[i];}return 0;
}

2.2除法,大除以大

#include <bits/stdc++.h>using namespace std;char s1[305], s2[305];
int a[305], b[305], c[305], tmp[305]; //c的长度最大为la-lb+1void init(int* x) {char s[305];cin >> s;x[0] = strlen(s);for (int i = 0; i < x[0]; i++) {x[i + 1] = s[x[0] - 1 - i] - '0'; // 正确逆序存储每一位}
}void print(int* x) {if (x[0] == 0) {cout << 0;return;}for (int i = x[0]; i >= 1; i--) {cout << x[i];}
}int compare(int a[], int b[]) {if (a[0] != b[0]) {return a[0] > b[0] ? 1 : -1;}for (int i = a[0]; i >= 1; i--) {if (a[i] != b[i]) {return a[i] > b[i] ? 1 : -1;}}return 0;
}void minu(int a[], int b[]) { // 修正函数名mine -> minufor (int i = 1; i <= a[0]; i++) {if (i <= b[0]) {a[i] -= b[i];}if (a[i] < 0) {a[i + 1]--;a[i] += 10;}}while (a[0] > 0 && a[a[0]] == 0) {a[0]--;}
}void numcpy(int p[], int q[], int n) {for (int i = p[0]; i >= 1; i--) {q[i + n] = p[i];}q[0] = p[0] + n;
}int main() {init(a);init(b);if (compare(a, b) < 0) { // 处理a < b的情况cout << 0;return 0;}c[0] = a[0] - b[0] + 1;for (int i = c[0]; i >= 1; i--) {memset(tmp, 0, sizeof(tmp));numcpy(b, tmp, i - 1); // 修正移动位数为i-1,因为商的最高位对应10^(la-lb)while (compare(a, tmp) >= 0) {c[i]++;minu(a, tmp);}}while (c[0] > 0 && c[c[0]] == 0) {c[0]--;}print(c);return 0;
}

相关文章:

  • 【多目标进化算法】 MOEA/D算法(知识点)
  • PH热榜 | 2025-04-25
  • [Windows] 电脑清理加速:Windows Cleaner v5.0.5
  • ORB-SLAM3核心模块、数据结构和线程交互方面解析
  • const(C++)
  • 有关虚拟奢侈品
  • 如何创建和推广高质量内容:SEO与内容营销的成功指南
  • MySQL索引优化、SQL分析与运行原理 - Java架构师面试实战
  • 基于LAB颜色空间的增强型颜色迁移算法
  • 为何 RAG 向量存储应优先考虑 PostgreSQL + pgvector 而非 MySQL?
  • 七、web自动化测试03
  • CAPL编程_03
  • 产品更新丨谷云科技ETLCloud V3.9.2版本发布
  • redis 数据类型新手练习系列——Hash类型
  • CRI、CSI 和 CNI 是三大核心接口标准
  • Python自动化解决滑块验证码的最佳实践
  • [Windows] 卡巴斯基Kaspersky 21.21.7.384 免费版
  • Linux文件管理2
  • sql server 开启cdc报事务正在执行
  • C++经典知识网页保存
  • 陈平评《艺术科学的目的与界限》|现代艺术史学的奠基时代
  • 中国人民银行行长潘功胜会见世界银行行长彭安杰
  • 经济日报:上海车展展现独特魅力
  • 云南蒙自:一汪南湖见证近代开埠史与西南联大的弦歌不绝
  • 一场12年的马拉松,他用声音陪伴中国路跑成长
  • 神舟二十号载人飞行任务新闻发布会将于4月23日上午召开