news 2026/4/29 19:53:07

C++高精度算法的使用场景详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++高精度算法的使用场景详解

描述

如果要计算的数超过了long long怎么解决? —>使用高精度加减乘除,简单理解就是 很大的数进行加减乘除。

1. 高精度加法

1. 思路

  • 创建对应的数组变量及其他变量
  • 输入字符串
  • 将读入的数据转化为整数类型,并逆序(反转)存储到数组中
  • 将两个数组做累加(注意进位)
  • 判断最高位是否为0,大于0代表进位了,则让长度加1
  • 倒序输出

2. 代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#include<bits/stdc++.h>

usingnamespacestd;

inta[510], b[510], c[510];//a:被加数 b:加数 c:和

intmain(){

// 1. 输入字符串

string str1,str2;

cin >> str1 >> str2;

// 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}

for(inti = 0; i < str1.size(); i ++)

a[str1.size()-1 - i] = str1[i] -'0';

for(inti = 0; i < str2.size(); i ++)

b[str2.size()-1 - i] = str2[i] -'0';

// 3. 找两个字符串最大的个数,目的是为了将每一位计算完

intans = max(str1.size(), str2.size());

// 4. 相加(a+b)

for(inti = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算

c[i] += a[i] + b[i];//相加

c[i+1] = c[i] / 10;// 进位

c[i] %= 10;//将加的结果求余10 得出第i位

}

//4. 如果结果数组第ans位的数大于0(大于0代表进位了),则让长度增加1

while(c[ans]>0) ans++;

//5. 倒序输出

for(inti = ans-1; i >= 0; i--)

cout << c[i];

return0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include<bits/stdc++.h>

usingnamespacestd;

inta[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:加数1 b:加数2 c:进位数组 ans:结果数组

intmain(){

// 1. 输入字符串

string str1,str2;

cin >> str1 >> str2;

len_a = str1.length();

len_b = str2.length();

// 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}

for(inti = 0; i < str1.size(); i ++)

a[str1.size()-1 - i] = str1[i] -'0';

for(inti = 0; i < str2.size(); i ++)

b[str2.size()-1 - i] = str2[i] -'0';

// 3. 找两个字符串最大的个数,目的是为了将每一位计算完

len_ans = max(len_a,len_b);

// 4. 相加(a+b)

for(inti=0;i<=len_ans;i++){

ans[i] = a[i] + b[i] + c[i];//结果数组 =(等于) 被加数 加上 加数 加上 进位的数

if(ans[i] > 9){//如果结果数组大于9,则进位

c[i+1] = ans[i] / 10;//给进位数组赋值

ans[i] %= 10;// 让结果数组大于9的数求余10,变成个位数

}

}

//5. 如果结果数组len_ans位的数大于0,则让长度增加1

while(ans[len_ans]>0) len_ans++;

//6. 倒叙输出

for(inti=len_ans-1;i>=0;i--) cout<<ans[i];

return0;

}

2. 高精度减法

1. 思路

  • 定义被减数a,减数b,结果c数组
  • 输入被减数和减数,并且将数据倒叙存入数组中。
  • 找两个字符串最大的个数,目的是为了将每一位计算完
  • 将两个数组做相减(遍历至最大长度,避免有的数字没计算 )。
  • 去掉前导 0 。例如结果为:089,不需要0
  • 循环遍历输出

2. 代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#include<bits/stdc++.h>

usingnamespacestd;

inta[510], b[510], c[510];//a:被减数 b:减数 c:结果

intmain(){

// 1. 输入字符串

string str1,str2;

cin >> str1 >> str2;

// 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}

for(inti = 0; i < str1.size(); i ++)

a[str1.size()-1 - i] = str1[i] -'0';

for(inti = 0; i < str2.size(); i ++)

b[str2.size()-1 - i] = str2[i] -'0';

// 3. 找两个字符串最大的个数,目的是为了将每一位计算完

intans = max(str1.size(), str2.size());

// 4. 相减(a-b)

for(inti = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算

if(a[i] < b[i]){

a[i+1] -= 1;//向前借一位

a[i] += 10;// 借一位以后加10

}

c[i] = a[i] - b[i];

}

//5. 如去掉前导 0 。例如结果为:089,不需要0

while(c[ans-1]==0 && ans>1) ans--;

//6. 倒序输出

for(inti = ans-1; i >= 0; i--)

cout << c[i];

return0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include<bits/stdc++.h>

usingnamespacestd;

inta[500],b[500],c[501],ans[501],len_a,len_b,len_ans;//a:被减数 b:减数 c:进位 ans:结果

intmain(){

// 1. 输入字符串

string str1,str2;

cin >> str1 >> str2;

len_a = str1.length();

len_b = str2.length();

// 2. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}

for(inti = 0; i < str1.size(); i ++)

a[str1.size()-1 - i] = str1[i] -'0';

for(inti = 0; i < str2.size(); i ++)

b[str2.size()-1 - i] = str2[i] -'0';

// 3. 找两个字符串最大的个数,目的是为了将每一位计算完

len_ans = max(len_a,len_b);

// 4. 相减(a-b)

for(inti=0;i<=len_ans;i++){

ans[i] = a[i] - b[i] - c[i];//结果数组 =(等于) 被减数 减去 减数 减去 进位的数

if(ans[i] < 0){//如果结果数组小于0,则借位

ans[i] += 10;// 借1位,加上10

c[i+1]++;// 进位数组加1

}

}

//5. 如去掉前导 0 。例如结果为:089,不需要0

while(len_ans>1 && ans[len_ans-1]==0) len_ans--;

//6. 倒序输出

for(inti=len_ans-1;i>=0;i--) cout<<ans[i];

return0;

}

3. 如果出现被减数的位数小于减数时呢

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

#include<bits/stdc++.h>

usingnamespacestd;

inta[510], b[510], c[510];//a:被减数 b:减数 c:结果

intflag = 0;

intmain(){

// 1. 输入字符串

string str1,str2;

cin >> str1 >> str2;

//2. str1.size() < str2.size() 或者 两个数一样长并且被减数的数值小于减数时,才需要交换两数位置

if(str1.size() < str2.size() || str1.size() == str2.size() && str1 < str2) {

string t = str1;

str1 = str2;

str2 = t;

flag = 1;

}

// 3. "1,2,3,4"转换为{1,2,3,4},并且反转 {4,3,2,1}

for(inti = 0; i < str1.size(); i ++)

a[str1.size()-1 - i] = str1[i] -'0';

for(inti = 0; i < str2.size(); i ++)

b[str2.size()-1 - i] = str2[i] -'0';

// 4. 找两个字符串最大的个数,目的是为了将每一位计算完

intans = max(str1.size(), str2.size());

// 5. 相减(a-b)

for(inti = 0; i < ans; i ++){//遍历至最大长度,避免有的数字没计算

if(a[i] < b[i]){

a[i+1] -= 1;//向前借一位

a[i] += 10;// 借一位以后加10

}

c[i] = a[i] - b[i];

}

//6.如去掉前导 0 。例如结果为:089,不需要0

while(c[ans-1]==0 && ans>1) ans--;

//7. 倒叙输出

if(flag == 1) cout<<"-";

for(inti = ans-1; i >= 0; i--)

cout << c[i];

return0;

}

到此这篇关于C++高精度算法的使用场景详解的文章就介绍到这了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 19:53:06

SAM2模型在病理图像分割中的优化与应用

1. 项目背景与核心价值 病理图像分割是医疗AI领域的重要研究方向&#xff0c;传统方法往往需要大量标注数据才能达到理想效果。SAM&#xff08;Segment Anything Model&#xff09;作为通用分割模型的出现&#xff0c;为医学图像分析带来了新的可能性。但直接将基础SAM模型应用…

作者头像 李华
网站建设 2026/4/29 19:52:35

OneNet新版MQTT数据上传实战:从Env_temp到云端可视化的完整链路

OneNet新版MQTT数据上传实战&#xff1a;从Env_temp到云端可视化的完整链路 当你用MQTT.fx成功连接到OneNet平台&#xff0c;看到设备状态灯由红变绿的那一刻&#xff0c;真正的挑战才刚刚开始。许多开发者会卡在"连接成功之后该做什么"这个关键环节——数据如何结构…

作者头像 李华
网站建设 2026/4/29 19:52:23

Safari DevTools MCP:基于模型上下文协议的浏览器自动化与AI集成指南

1. 项目概述&#xff1a;一个让Safari开发者工具“开口说话”的桥梁 如果你是一名Web开发者&#xff0c;或者经常需要调试网页&#xff0c;那么对Chrome DevTools&#xff08;开发者工具&#xff09;一定不陌生。它的强大和便捷&#xff0c;几乎成了前端开发的标配。但如果你主…

作者头像 李华
网站建设 2026/4/29 19:51:21

PowerShell ImportExcel模块:无需Excel的终极数据处理解决方案

PowerShell ImportExcel模块&#xff1a;无需Excel的终极数据处理解决方案 【免费下载链接】ImportExcel PowerShell module to import/export Excel spreadsheets, without Excel 项目地址: https://gitcode.com/gh_mirrors/im/ImportExcel 还在为处理Excel数据而烦恼吗…

作者头像 李华
网站建设 2026/4/29 19:48:46

3D高斯泼溅技术解析与F4Splat创新应用

1. 3D高斯泼溅技术基础解析3D高斯泼溅&#xff08;3D Gaussian Splatting&#xff09;是近年来计算机视觉领域突破性的显式3D场景表示方法。与传统的隐式神经辐射场&#xff08;NeRF&#xff09;不同&#xff0c;它采用显式的高斯基元集合来表征场景&#xff0c;每个基元包含位…

作者头像 李华
网站建设 2026/4/29 19:48:40

Cursor Pro激活器完全指南:轻松实现AI编程助手无限试用

Cursor Pro激活器完全指南&#xff1a;轻松实现AI编程助手无限试用 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tr…

作者头像 李华