高精度加法 A+B 问题

简介: 高精度加法 A+B 问题

如果在一定范围内,求解A+B,我们可以用int 或者 long long 来装,对吧,但是呢,如果我的A和B有几千位的话,那就不能这么做了,当然,在其他语言中,比如java有大数运算,那也可以通过大数运算来做,但c/c++中是没有的,我们需要用高精度来做,我们以字符串的形式来处理,后面的运算就用到了我们小学数学的思想,具体的我们来看代码嘛,注释很详细的额

代码如下:大家注意下,我是用的dev c++写的额

//思想是 小学数学加法进位的思想 
#include<bits/stdc++.h> 
using namespace std;
string s1,s2;
int ans[1000010];
int a[1000010],b[1000010];//a  b  数组用来装输入的数字 从低位到高位 。比如 :输入 123  数组装的是321 
int main(){
  cin>>s1>>s2;
  int len1=s1.size(),len2=s2.size();//分别 记录长度 
  for(int j=0,i=len1-1;i>=0;i--){//将输入的内容  从数字的低位开始存入 比如 输入 123   那么a数组前三位装的就是 321  
    a[j++]=s1[i]-'0';
  }             
  for(int j=0,i=len2-1;i>=0;i--){//同上 
    b[j++]=s2[i]-'0';
  }
  int carry=0;//进位   
  int len=0;//用于记录运算结果的长度 
  for(int i=0;i<max(len1,len2);i++){ //这里的 i 的范围要小于  最大长度   这个应该能理解吧 
    int t=a[i]+b[i]+carry;//低位与低位相加,在加上进位    这里好好回忆下小学数学就会明白 
    ans[len++]=t%10;// 这里的t有可能大于9  所以要存入个位额       
    carry=t/10; //这里就是求进位的那个了  比如 开始 是6+9  那么t等于15  通过小学知识得  要进位 1 对吧  这里carry就表示进位 
  }  
  if(carry!=0){//如果最终的进位不是0的话 那么他就是我们最终结果的最高位 
    ans[len++]=carry;
  }
  for(int i=len-1;i>=0;i--){//好的,终于是要完成了哈  这里就输出结果 是逆序输出额 (这里晓得为啥子噻 ) 
    cout<<ans[i];
  }             
  return 0;
} 

下面是图片版


相关文章
|
Java C++
poj 1503 高精度加法
把输入的数加起来,输入0表示结束。 先看我Java代码,用BigINteger类很多东西都不需要考虑,比如前导0什么的,很方便。不过java效率低点,平均用时600ms,C/C++可以0ms过。
40 1
|
12月前
|
C++
筛质数、分解质因数和快速幂的应用
筛质数、分解质因数和快速幂的应用
61 0
|
5天前
辗转相除法
【10月更文挑战第21天】辗转相除法。
10 2
|
6月前
|
人工智能 Java BI
快速幂讲解
快速幂讲解
44 0
|
物联网
快速幂
快速幂
80 0
容斥原理 (两个例题)
容斥原理 (两个例题)
143 0
|
存储
【4. 高精度加法】
高精度加法 >## 思路: >- 大整数存储(用数组来存储,数组第0位,存低位,数组最后一位存高位),因为在进行加法运算时,通常会有进位,而在数组的最后一位,进位比较容易,而如果在数组开头进位的话,需要把整个数组移动一位。 >- 数组的每一位存一位数字
100 0
【4. 高精度加法】
AcWing 756. 蛇形矩阵
AcWing 756. 蛇形矩阵
69 0
AcWing 756. 蛇形矩阵