高精度减法运算

Posted kannyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高精度减法运算相关的知识,希望对你有一定的参考价值。

eg:计算10002-99的差

#include "stdio.h"
#include "string.h"
#include "algorithm"
#define N 3005
using namespace std;
int cmp(char a[],char b[])            //比较两个数大小
{                                     //如果 a>b返回1,a=b返回0,a<b返回-1
    int lena=strlen(a);
    int lenb=strlen(b);
    if(lena>lenb)return 1;            
    if(lena==lenb)return strcmp(a,b); 
    if(lena<lenb)return -1;
} 
void sub(char a[],char b[],char c[])
{
    int t,i,r=0;
    int res=cmp(a,b);
    if(res<0)                        //如果第一个数小,需要交换 
    {
        strcpy(c,a);
        strcpy(a,b);
        strcpy(b,c); 
    } 
    else if(res==0)                  //如果相等直接跳出 
    {
        strcpy(c,"0");
        return;
    }
    strrev(a);                       //逆序 
    strrev(b);                       //逆序 
    for(i=0;b[i]!=\0;i++)          //低位至高位 
    {
        t=(a[i]-0-r)-(b[i]-0);   //每位上的相减 
        if(t<0)
        {
            r=1;                     //向高位借1 
            t=t+10;
        } 
        else r=0;                    //不借位 
        c[i]=t+0;                  //结果转换为字符 
    }
    for(;a[i]!=\0;i++)             //a中剩下的还需考虑借位 
    {
        t=a[i]-0-r;
        if(t<0)
        {
            r=1;
            t=t+10;
        }
        else r=0;
        c[i]=t+0;
    }
    while(c[i-1]==0)               //去除前导0 
    i--;
    if(res<0)                        //若结果为负 
    c[i++]=-;                      
    c[i]=\0;                       //结尾 
    strrev(c);                       //逆序回正常 
}
int main()
{
    char a[N],b[N],c[N];
    scanf("%s %s",a,b);
    sub(a,b,c);
    puts(c);                                                                                            
    return 0;
}

 

以上是关于高精度减法运算的主要内容,如果未能解决你的问题,请参考以下文章

高精度减法运算

高精度运算经典题目-减法神童

高精度运算(除法待完善)

高精度运算(除法待完善)

大数运算(加减乘除)

减法导致精度问题