高精度加法 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过。
43 1
筛质数、分解质因数和快速幂的应用
筛质数、分解质因数和快速幂的应用
62 0
|
7月前
|
C++
【PTA】​ L1-080 乘法口诀数列​(C++)
【PTA】​ L1-080 乘法口诀数列​(C++)
97 0
【PTA】​ L1-080 乘法口诀数列​(C++)
|
7月前
|
人工智能 Java BI
快速幂讲解
快速幂讲解
46 0
一个求公约数和公倍数的有趣求法
一个求公约数和公倍数的有趣求法
60 0
|
物联网
快速幂
快速幂
81 0
|
机器学习/深度学习
N皇后问题
N皇后问题
81 0
|
算法
n皇后问题
n皇后问题
114 0