• C/C++高精度


    个人主页仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客

    专题分栏:算法_仍有未知等待探索的博客-CSDN博客

    为什么需要高精度算法?

    由于c++不能进行位数过高的数据运算,所以要通过模拟数组来进行运算,首先是加法。通过char或string型数据输入字符来模拟数字的输入,数组下表对应的元素应当是处于同一位置的数字,下标相同的两个元素相加表示的既是结果。

    目录

    一、高精度加法

    1、思路

    2、代码

    二、高精度乘法 

    1、思路

    2、代码 


    一、高精度加法

    1、思路

    其实高精度加法和普通的加法思路没有什么区别。就是个位数先相加,然后判断进位,在把进位进行相加。最后得到结果。

    从个位开始进行相加,进位操作。(通过数组进行存储) 

    2、代码

    1. #include
    2. #include
    3. using namespace std;
    4. const int N = 510;//数字最大可以存储509位的数字
    5. int a[N];//要相加的数字
    6. int b[N];//要相加的数字
    7. int c[N];//得到的结果
    8. int main()
    9. {
    10. string str1;//要想加的数字
    11. string str2;//要相加的数字
    12. cin >> str1;
    13. cin >> str2;
    14. //将str1和str2进行逆置存放
    15. for (int i = 0; i < str1.size(); i++)
    16. a[str1.size() - 1 - i] = str1[i] - '0';
    17. for (int i = 0; i < str2.size(); i++)
    18. b[str2.size() - 1 - i] = str2[i] - '0';
    19. //得到最大的位数
    20. int ans = max(str1.size(), str2.size());
    21. for (int i = 0; i < ans; i++) {
    22. c[i] += a[i] + b[i];//相加
    23. c[i + 1] = c[i] / 10;//进位
    24. c[i] %= 10;//如果1位数大于10,对其进行取余
    25. }
    26. ans += 1;//避免最大位数相加完之后有进位:比如说500+500,5+5=10,要进位
    27. //去除前导0
    28. if (c[ans - 1] == 0 && ans > 1)
    29. ans -= 1;
    30. //输出
    31. for (int i = 0; i < ans; i++)
    32. cout << c[ans - 1 - i];
    33. return 0;
    34. }

    二、高精度乘法 

    1、思路

    • 按照常规的高精度乘法的思路,分别先用两个数组逆序存储两数,方便计算。
    • 结果的长度必然不会超过两数的长度之和
    • 进行乘法运算时,我们可以先不用考虑进位,按照常规思路直接算。
    • 计算完成后,处理数组中结果大于或等于10的位置,即向前进位。
    • 最后,处理前导零,将结果逆序输出。

    高精度乘法和竖式运算的乘法思路是一样的。如图所示:

    根据上面的规律可以知道下图的公式。 

    2、代码 

    1. #include
    2. using namespace std;
    3. const int N = 2000;
    4. int m[N];//要算的数
    5. int n[N];//要算的数
    6. int ans[2 * N];//所得的答案
    7. int main() {
    8. string a, b;//字符串输入
    9. cin >> a >> b;
    10. int la = a.size();//a的字符串长,也就是乘数的位数
    11. int lb = b.size();//b的字符串长,也就是乘数的位数
    12. int i = 0, j = 0;
    13. //逆序存入数组中
    14. for (i = 0; i < la; i++) {
    15. m[i] = a[la - i - 1] - '0';
    16. }
    17. //逆序存入数组中
    18. for (j = 0; j < lb; j++) {
    19. n[j] = b[lb - j - 1] - '0';
    20. }
    21. //根据公式进行计算
    22. for (i = 0; i < la; i++) {
    23. for (j = 0; j < lb; j++) {
    24. ans[i + j] += m[i] * n[j];
    25. }
    26. }
    27. //上述仅进行了计算各个位的数,没有考虑进位
    28. //下面循环考虑进位
    29. //ns为答案的位数,由例子可知,答案的位数的最小值为la+lb-1
    30. int ns = la + lb - 1;
    31. for (i = 0; i < ns; i++) {
    32. //各位大于9时,才考虑进位的问题
    33. if (ans[i] > 9) {
    34. ans[i + 1] += ans[i] / 10;
    35. ans[i] %= 10;
    36. }
    37. //如果i+1进位大于ns,ns要进行更新
    38. if (i + 1 > ns) {
    39. ns++;
    40. }
    41. }
    42. //逆序打印
    43. //考虑先导0的问题
    44. if (ans[i] == 0 && ns > 1)
    45. ns--;
    46. for (i = ns; i >= 0; i--) {
    47. cout << ans[i];
    48. }
    49. return 0;
    50. }

     谢谢大家的支持!

  • 相关阅读:
    微信小程序使用echarts组件实现饼状统计图功能
    WSW-PEG-IR825 肝靶向多肽WSW-聚乙二醇-近红外荧光染料IR825
    Prometheus之node_exporter服务器采集信息泛释
    【考研数学】概率论与数理统计 —— 第三章 | 二维随机变量及其分布(3,二维随机变量函数的分布)
    以太网通讯与485通讯哪个好?
    高等院校教师资格证考试怎么考,要什么条件?
    基于Python的购物网站分析系统
    建模杂谈系列170 APIFunc继续实践-数据处理体系
    Kotlin 不可变数组和可变数组
    功利点没啥!
  • 原文地址:https://blog.csdn.net/qq_73435980/article/details/134476558