高精度算法(+、-、*)(C++)

高精度

输入

void Input(long long a[])
{
 char s[10005];
 scanf("%s",s);
 long long len=strlen(s);
 for(long long i=1;i<=len;i++)
 {
  a[i]=s[len-i]-'0';
 }
}

进、借位

加法

c[i]=a[i]+b[i];
if(c[i]>=10)
{
 c[i]%=10;
 c[i+1]++;
}

减法

if(a[i]<b[i])
{
 a[i+1]--;
 a[i]+=10;
}
c[i]=a[i]-b[i];

乘法

c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
x=c[i+j-1]/10;
c[i+j-1]%=10;

AC代码+注释

加法

#include<bits/stdc++.h>
using namespace std;

long long a[10005],b[10005],c[10005],lena,lenb,lenc,x=0;
char a1[10005],b1[10005];

int main()
{
 scanf("%s %s",a1,b1);
 //输入 
 lena=strlen(a1);
 lenb=strlen(b1);
 for(long long i=0;i<=lena-1;i++)
 {
  a[lena-i]=a1[i]-48;
 }
 for(long long i=0;i<=lenb-1;i++)
 {
  b[lenb-i]=b1[i]-48;
 }
 //加数存贮
 for(lenc=1;lenc<=lena||lenc<=lenb;lenc++)
 {
  c[lenc]=a[lenc]+b[lenc]+x;
  x=c[lenc]/10;
  c[lenc]%=10;
 }
 //相加 
 c[lenc]=x;
 if(!c[lenc])
 {
  lenc--;
 }
 //最高位进位 
  for(long long i=lenc;i>=1;i--)
 {
  printf("%lld",c[i]);
 }
 //输出 
 return 0;
}

减法

#include<bits/stdc++.h>
using namespace std;

long long a[10005],b[10005],c[10005],lena,lenb,lenc;
char n[10005],n1[10005],n2[10005];

int main()
{
 scanf("%s %s",n1,n2);
 //输入 
 if(strlen(n1)<strlen(n2)||(strlen(n1)==strlen(n2)&&strcmp(n1,n2)<0))
 //strcmp()为字符串比较函数。当n1==n2,返回0;>时,正整数;<,负
 //如果被减数的位数比减数少 或 被减数比减数小,交换 并 因为结果是负数而输出“-”号
 {
  strcpy(n,n1);
  //将n1数组的值完全赋值给n数组(交换) 
  strcpy(n1,n2);
  strcpy(n2,n);
  printf("-");
  //因为结果是负数而输出“-”号
 }
 lena=strlen(n1);
 lenb=strlen(n2);
  for(long long i=0;i<=lena-1;i++)
 {
  a[lena-i]=n1[i]-48;
 }
 for(long long i=0;i<=lenb-1;i++)
 {
  b[lenb-i]=n2[i]-48;
 }
 //存贮 
 for(lenc=1;lenc<=lena||lenc<=lenb;lenc++)
 {
  if(a[lenc]<b[lenc])
  {
   a[lenc]+=10;
   a[lenc+1]--;
  }
  //不够减就借位,向高位借1当10 
  c[lenc]=a[lenc]-b[lenc];
  //对应位相减 
 }
 while((!c[lenc])&&(lenc>1))
 {
  lenc--;
 }
 //最高位的0不输出 
 for(long long i=lenc;i>=1;i--)
 {
  printf("%lld",c[i]);
 }
 //输出 
 return 0;
}

乘法

#include<bits/stdc++.h>
using namespace std;

long long a[10005],b[10005],c[10005],lena,lenb,lenc,x;
char a1[10005],b1[10005];

int main()
{
 scanf("%s %s",a1,b1);
 lena=strlen(a1);
 lenb=strlen(b1);
 for(long long i=0;i<=lena-1;i++)
 {
  a[lena-i]=a1[i]-48;
 }
 for(long long i=0;i<=lenb-1;i++)
 {
  b[lenb-i]=b1[i]-48;
 }
 for(long long i=1;i<=lena;i++)
 {
  x=0;
  //x用于存放进位 
  for(long long j=1;j<=lenb;j++)
  //对乘数的每一位进行处理 
  {
   c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
   //当前乘积+上次进位乘积+原数 
   x=c[i+j-1]/10;
   c[i+j-1]%=10;
  }
  c[i+lenb]=x;
  //进位 
 }
 lenc=lena+lenb;
 while(!c[lenc]&&lenc>1)
 {
  lenc--;
 }
 //最高位的0不输出
 for(long long i=lenc;i>=1;i--)
 {
  printf("%lld",c[i]);
 }
 return 0;
}

猜你喜欢

转载自blog.csdn.net/cqbzybc20220707/article/details/107885582