高精度算法之加法减法

一丶高精度加法

高精度加法是高精度算法里面最容易思考的一个;其实现过程并不难;注意的地方应该是进位的问题;
思路:我们可以设两个数组a[10090],b[10090],这两个数组的作用是用来存储高精度数的数位;
string类型字符串str1,str2(用来输入数据);
然后贴代码

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a[10090],b[10090];
int main()
{   memset(a,0,sizeof(a));//先将数组清零;
    memset(a,0,sizeof(b));
    int n;
    string str1,str2;
    cin>>str1>>str2;
    n=str1.length();
    for(int i=1;i<=n;i++)
    {
        a[i]=str1[n-i]-'0';//这一步是将字符转换成数字并且倒序存入数组中;
    }
    int n2=str2.length();
    for(int i=1;i<=n2;i++)
    {
        b[i]=str2[n2-i]-'0';//同上;
    }
    int len;
    len=(n>n2?n:n2);//len的值是n与n2中较大的;
    //我们不需要知道a,b数组哪个长度较长,我们只需要用a数组来进行相加操作;
    for(int i=1;i<=len;i++)
    {
        a[i]+=b[i];//相加,没什么好说的;
        a[i+1]+=a[i]/10;//进位;
        a[i]%=10;//取余;
    }
    if(a[len+1])//两个数相加,可能出现进1位的可能;
    len++;
        for(int i=len;i>=1;i--)//输出;
        {
            printf("%d",a[i]);
        }
    printf("\n");

    return 0;
}

二丶高精度减法

高精度减法比加法要麻烦一点;具体表现在需要考虑借位的问题
先贴一波代码,明天再更新~

#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a[190044],b[189449];
int main()
{
    string str1,str2;
    cin>>str1>>str2;
        int  n;
        n=str1.length();
        memset(a,0,sizeof(a));
        memset(a,0,sizeof(b));
        for(int i=1; i<=n; i++)
        {
            a[i]=str1[n-i]-'0';
        }
        int n2=str2.length();
        for(int i=1; i<=n2; i++)
        {
            b[i]=str2[n2-i]-'0';
        }//这里和加法是一样的
        int c=0;
        if(n==n2)//这里主要是通过c的值来判断a,b的取值哪个更大;
        {
            for(int i=n; i>=1; i--)
            {
                if(a[i]<b[i])
                {
                    c=1;
                    break;
                }
                else if(a[i]>b[i])
                {
                    c=2;
                    break;
                }
            }
            if(!c)printf("0\n");//如果a,b的长度相等且c还为0,则这两个值相等
        }
        if(n>n2||c==2)//这里是a>b的情况下
        {
            for(int i=1; i<=n; i++)
            {
                a[i]-=b[i];//先进行减法操作
                if(a[i]<0)//如果出现借位的情况
                {
                    a[i]=-a[i];//借位就代表+10再-b;
                    a[i]=10-a[i];
                    a[i+1]--;
                }
            }
            while(!a[n])n--;//这里是去掉前导0;
            for(int i=n; i>=1; i--)
            {
                printf("%d",a[i]);
            }
        }
        else if(n2>n||c==1)//这里是b>a的情况,同上;
        {
            for(int i=1; i<=n2; i++)
            {
                b[i]-=a[i];
                if(b[i]<0)
                {
                    b[i]=-b[i];
                    b[i]=10-b[i];
                    b[i+1]--;
                }
            }
            while(!b[n2])n2--;
            printf("-");//注意细节;
            for(int i=n2; i>=1; i--)
            {
                printf("%d",b[i]);
            }
        }
        printf("\n");
    return 0;
}

这个代码并不完美;在做的过程中遇到了各种各样的错误,然而这些错误是粗心导致,以至于糊里糊涂WA了几发;贴在这里引以为戒;

#include<iostream>  
using namespace std;  
int compare(string s1,string s2);  
int main()  
{  
  string str1,str2;  
  int a[250],b[250],len;  
  int i;  
  memset(a,0,sizeof(a));  
  memset(b,0,sizeof(b));  
  cin>>str1>>str2;  
  a[0]=str1.length();  
  for(i=1;i<=a[0];i++)  
    a[i]=str1[a[0]-i]-'0';  
  b[0]=str2.length();  
  for(i=1;i<=b[0];i++)  
    b[i]=str2[b[0]-i]-'0';  
  if((compare(str1,str2))==0)  //大于等于,做按位减,并处理借位。  
  {  
    for(i=1;i<=a[0];i++)  
      {a[i]-=b[i];  
       if (a[i]<0) {a[i+1]--;a[i]+=10;}  
      }  
    a[0]++;  
    while((a[a[0]]==0)&&(a[0]>1)) a[0]--;  
    for(i=a[0];i>=1;i--)  
      cout<<a[i];  
    cout<<endl;   
  }                            
  else  
  {  
    cout<<'-';  //小于就输出负号  
    for(i=1;i<=b[0];i++)  //做按位减,大的减小的  
      {b[i]-=a[i];  
       if (b[i]<0) {b[i+1]--;b[i]+=10;}  
      }  
    b[0]++;  
    while((b[b[0]]==0)&&(b[0]>1)) b[0]--;  
    for(i=b[0];i>=1;i--)  
      cout<<b[i];  
    cout<<endl;          
  }  
  return 0;   
}  
int compare(string s1,string s2)  //比较字符串(两个数)数字的大小,大于等于返回0,小于返回1。  
{  
  if(s1.length()>s2.length()) return 0;  //先比较长度,哪个字符串长,对应的那个数就大  
  if(s1.length()<s2.length()) return 1;  
  for(int i=0;i<=s1.length();i++)  //长度相同时,就一位一位比较。  
  {  
    if(s1[i]>s2[i]) return 0;  
    if(s1[i]<s2[i]) return 1;                            
  }  
  return 0;   //如果长度相同,每一位也一样,就返回0,说明相等  
} 

标准代码;
下一篇要做乘法和除法了;再会~;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值