高精度的模拟题(大数相加)

题目链接
(手动点击跳转)


下面是正文

题目背景:先总结一下常用的数据类型

1.char(一字节,八位) -128~127
2.int(四字节,三十二位) -231~-231-1,大约能够表示绝对值不超过2.1x10^9的整数
3.unsigned int(四字节,三十二位) 0~232-1大约能够表示4.2x109的非负整数
4.long long(八字节,六十四位) -263~263-1,大约能够表示绝对值不超过9.2x10^18的整数
5.unsigned long long(八字节,六十四位) 0~264-1,大约能够表示不超过1.8x1019的非负整数
6.float(四字节,三十二位) 大约能够表示 指数绝对值不超过37,六位有效数字
7.double(八字节,六十四位) 大约能够表示 指数绝对值不超过307,15位有效数字
由以上总结可以知道,常用数据类型超大数的时候,无法正常进行存储,会出现数值溢出的现象,因此我们需要用数组来进行模拟高精度运算。

AC代码:

#include <iostream>
#include <cstring>
using namespace std;
int a[520],b[520],c[520];

int main()
{
    string A,B;
    cin >> A >> B;
    int len = max(A.length(),B.length());
    for(int i=A.length()-1,j=1;i>=0;i--,j++){
        a[j] = A[i] - '0';
    }
    for(int i=B.length()-1,j=1;i>=0;i--,j++){
        b[j] = B[i] -'0';
    }  //反向存储
    for(int i=1;i<=len;i++){ //模拟从低位到高位进行运算
        c[i] +=a[i]+b[i];
        c[i+1] = c[i]/10;
        c[i] %=10;
    }
    while(c[len+1]){
        len++;
    }
    for(int i=len;i>0;i--){
        cout << c[i] ;
    }
    return 0;
}
posted @ 2022-03-12 10:30  TCcjx  阅读(30)  评论(0编辑  收藏  举报