首页 > 技术文章 > 高精度减法

noipbar 2018-11-23 21:58 原文

  高精度减法,模拟常规立竖式计算,各位数对齐,从各位开始减,如果不够,向一位

借一作10。如下图所示:

高精度减法需要注意的问题:

对两个数做比较,根据前面介绍的高精度数据输出,如果两个数长度不同,则长度较长的数作为被减数

如果两个数长度相同,从高位开始到低位,每位数字相比较,数字较大的数一定大。

高精度减法算法实现如下:

#include <iostream>
#include <cstring>
using namespace std;
const int N =1001;
int aa[N],bb[N],cc[N]; //定义计算数和输出结果

void inputNum(string ss,int a[]); //输入需要计算的数保存到数组
void printArr(int a[]);  //输出数组的元素
void jisuan(int a[],int b[],int c[]);
int main()
{
    string s1 ="78345359834";
    string s2 ="26245874563";
    inputNum(s1,aa);
    printArr(aa);
    
    inputNum(s2,bb);
    printArr(bb);
    int temp =compare(aa,bb);
    if (temp==0) cout<<"0"<<endl;
    if (temp>0)
       jisuan(aa,bb,cc);
    else
    {
        cout<<"-";
        jisuan(bb,aa,cc);
    }
    printArr(cc);
    return 0;
}

int compare (int a[],int b[])
{
    int i;
    if (a[0]>b[0]) return 1;
    if (a[0]<b[0]) return -1;
    for (i=a[0];i>0;i--)
    {
        if (a[i]>b[i]) return 1;
        if (a[i]<b[i]) return -1;
    }
    return 0;
}

void jisuan(int a[],int b[],int c[])
{
    for (int i=1;i<=a[0];i++)
    {
        if (a[i]<b[i])
        {
            a[i+1]--;
            a[i]+=10;
        }
        c[i]=a[i]-b[i];
    }
    int lenc = a[0];
    while (c[lenc]==0)  //求结果的长度
    {
        lenc--;
    }
    c[0] =lenc;
}

void inputNum(string ss,int a[])
{
    int len = ss.length();
    a[0] = len;
    for (int i=0;i<len;i++)
    {
        a[len-i] = ss[i] -48;//字符变成数字,并且倒序存储
    }
}
void printArr(int a[])
{
    for (int i=a[0];i>0;i--)
    {
        cout<<a[i];
    }
    cout<<endl;
}

 

推荐阅读