C++高精度加法

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <string>
#include <cstring>
 
using namespace std;
 
/*
按顺序打印数组元素
flag为true时正序打印
flag为false时倒序打印
*/
template <typename T>
void show(T arr[], int len, bool flag=true){
    if(flag)    // 正序打印
        for(int i=0;i<len;i++)
            cout << arr[i];
    else        // 逆序打印
        for(int i=len-1;i>=0;i--)
            cout << arr[i];
    cout << endl;
}
 
int main()
{
    string str1, str2;
    // 字符串方式获取数字
    cin >> str1 >> str2;
     
    // 确定字符串的长度
    int len1 = str1.length();
    int len2 = str2.length();
    // 取最长的字符长度作为转换后的数字数组长度,确保长度不一的加数遍历不会越界
    // 如1248+384466转为842100 和 664483
    int len = len1 > len2 ? len1 : len2;
     
    // 根据确定的长度创建用于存储数字的数组,
    int num1[len],num2[len];
     
    // 使用memset函数将内存数据置为0
    memset(num1, 0, sizeof(num1));
    memset(num2, 0, sizeof(num2));
     
    // 倒序的方式填充数字数组
    // str1和str2中存储的是数字字符,每个数字字符有其对应的ASCII码值,'0'字符ASCII码值为48
    // 因此要将字符转为int值,可以用str[i]-'0'或str[i]-48求字符差值的方式计算
    for(int i=0;i<len1;i++) num1[i] = str1[len1-i-1]-'0';
    for(int i=0;i<len2;i++) num2[i] = str2[len2-i-1]-48;
    // show(num1, len);
    // show(num2, len);
     
    // 加法的极限就是最大加数的长度+1,因此可以初步判断和的最大长度
    int num3[len+1];
     
    // 进行加运算
    // index为和数组的当前下标,最终也为和数组的实际长度-1
    // x为每位相加后的进位值
    int index = 0, x = 0;
    while(index < len)
    {
        // 对应的位求和并加上已存在的进位值
        num3[index] = num1[index] + num2[index] + x;
        // 两位相加大于10,需要进位
        if(num3[index] > 10)
        {
            // 求进位部分
            x = num3[index] / 10;
            // 取余
            num3[index] %= 10;
        }else x = 0;    // 没超过10,x为0
        index++;
    }
     
    // while循环完成,如果x不为0,说明最高位应赋值
    // x为0则说明和未突破加数的位数,index--以作为num3的实际长度
    if(x != 0)
    {
        num3[index] = x;
    }
    else index--;
     
    show(num3, index+1, false);
     
    return 0;
}

  

posted @   我信你个鬼!  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示