2 条题解
-
6
众所周知,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
- 上传者
冀公网安备13098402000493号