2 条题解

  • 6
    @ 2026-5-19 11:30:35

    众所周知,int变量的存储范围是-2²³~2²³-1,long long变量的存储范围是-2⁶³~2⁶³-1,即使是 unsigned long long 或 __int128,可存储的数字最大位数也分别只有 20 位和 39 位。那么在涉及更大数字的运算时,就要用到高精度了。

    实现原理

    当大部分变量无法存储下如此大的数字时,我们可以考虑使用 string 以字符串形式存储下来,并且按数位将其按位对齐地存储在数组中。为了方便计算,我们要将原来的数字倒序存储,即个位数存储在数组开头,依次类推。

    cin>>A>>B; //以字符串的形式存储大数字  
    lena=A.size(),lenb=B.size(); //统计数字位数  
    for(int i=0;i<lena;i++) a[lena-i-1]=A[i]-'0'; //倒序拆位存放  
    for(int i=0;i<lenb;i++) b[lenb-i-1]=B[i]-'0';
    

    接着使用类似于小学数学中的竖式计算法,按位相加,处理进位。

    len=max(lena,lenb); //统计进行计算的位数  
    for(int i=0;i<len;i++)
    {
      c[i]+=a[i]+b[i]; //这里是 += 而不是 +,因为在前一位计算时可能有进位  
      if(c[i]>=10) c[i]-=10,c[i+1]++; //处理进位  
    }
    
    

    最后倒序输出即可。注意可能在最高位仍然存在一次进位,要特判一下是否存在这个情况。

    if(c[len]) cout<<c[len]; //如果最高位又进位了一次,那么也要输出  
    for(int i=len-1;i>=0;i--) cout<<c[i]; //倒序输出  
    cout<<"\n";
    
    

    那么没有负数的高精度加法就完成了。

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    const int N=5e2+5;
    string A,B;
    int a[N],b[N],c[N],lena,lenb,len;
    int main() 
    {
        ios::sync_with_stdio(false);
        cin.tie(0);cout.tie(0);
        cin>>A>>B; 
        lena=A.size(),lenb=B.size();  
        for(int i=0;i<lena;i++) a[lena-i-1]=A[i]-'0';   
        for(int i=0;i<lenb;i++) b[lenb-i-1]=B[i]-'0';
        len=max(lena,lenb);
        for(int i=0;i<len;i++)
        {
        	c[i]+=a[i]+b[i]; 
        	if(c[i]>=10) c[i]-=10,c[i+1]++;   
    	}
    	if(c[len]) cout<<c[len]; 
    	for(int i=len-1;i>=0;i--) cout<<c[i];  
    	cout<<"\n";
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    336
    提交时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    5
    已通过
    4
    上传者