关于高精度计算

当遇到数值超过long long范围的数字要进行四则运算的时候,就要运用高精度来解决。

高精度的计算其实就是把我们现实中手算的过程搬到程序上,让程序来替我们计算就行了。

1.加法

#include<bits/stdc++.h>
using namespace std;
const int N = 505;
char a1[N],b1[N];
int a[N],b[N],c[N];
int main()
{
  scanf("%s %s",a1,b1);
  int la=strlen(a1),lb=strlen(b1);
   //要从个位加起,所以先把各位数倒着存放
  for(int i=0;i<la;++i)a[la-i-1]=(int)a1[i]-'0';
  for(int i=0;i<lb;++i)b[lb-i-1]=(int)b1[i]-'0';
  int len=0,x=0;//x用来存储进位
  while(len<=la||len<=lb)
  {
    c[len]=a[len]+b[len]+x;
    x=c[len]/10;
    c[len]%=10;
    len++;
  }
  if(c[len-1]==0)len--;
  for(int i=len-1;i>=0;--i)cout<<c[i];
  cout<<endl;
  return 0;
}
View Code

 

 

2.减法 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10090;
string a1,b1,c1;
int a[N],b[N],c[N];
int main()
{
  cin>>a1>>b1;
  if(a1.size()<b1.size()||
  (a1.size()==b1.size()&&a1<b1))//要保证是大减小,否则交换顺序,输出符号
  {
    c1=a1;
    a1=b1;
    b1=c1;
    cout<<"-";
  }
  int la=a1.size(),lb=b1.size();
  //和加法一样,从个位开始减起
  for(int i=0;i<la;++i)a[la-i-1]=(int)a1[i]-'0';
  for(int i=0;i<lb;++i)b[lb-i-1]=(int)b1[i]-'0';
  int len=0;
  while(len<la)
  {
    c[len]=a[len]-b[len];
    if(c[len]<0)//小于零向前借一位
    {
        c[len]+=10;
        a[len+1]--;
    }
    len++;
  }
  for(int i=len;i>0;--i){//去掉前导0
    if(c[len]==0)len--;
    else break;
  }
  for(int i=len;i>=0;--i)cout<<c[i];

}
View Code

 

3.乘法

#include<bits/stdc++.h>
using namespace std;
const int N = 2007;
string a1,b1;
int a[N],b[N],c[N];
int main()
{
  cin>>a1>>b1;
  int la=a1.size(),lb=b1.size();
  int len=la+lb-1;
  for(int i=0;i<la;++i)a[la-i-1]=(int)a1[i]-'0';
  for(int i=0;i<lb;++i)b[lb-i-1]=(int)b1[i]-'0';
  //一位一位的乘
  for(int i=0;i<la;++i)
  {
    for(int j=0;j<lb;++j)
    {
        c[i+j]+=a[i]*b[j];
        c[i+j+1]+=c[i+j]/10;
        c[i+j]%=10;
    }
  }
  //去掉前导0
  for(int i=len;i>0;--i)
  {
    if(c[len]==0)len--;
  }
  for(int i=len;i>=0;--i)cout<<c[i];
  return 0;
}
View Code

 

4.除法

*仅适用高精度除于低精度

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 1e3;
char a1[N],c1[N];
int a[N],c[N],b;
int main()
{
  scanf("%s",a1);
  cin>>b;
  int len=strlen(a1);
  for(int i=0;i<len;i++)
  {
      a[i+1]=a1[i]-48;
  }
  int x=0;//记录余数
  for(int i=1;i<=len;i++)
  {
    c[i]=(x*10+a[i])/b;
    x=(x*10+a[i])%b;
  }
  int lenc=1;
  while(c[lenc]==0&&lenc<len)lenc++;//去掉前导0
  for(int i=lenc;i<=len;i++)cout<<c[i];
  return 0;
}
View Code

 

posted @ 2020-03-04 19:47  Hai_Lin  阅读(132)  评论(0)    收藏  举报