欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

高精度减法运算

程序员文章站 2022-03-21 19:32:30
eg:计算10002-99的差 ① ......

在C语言中,int类型最多只能表达的数据为【-2^31,2^31-1】,double类型虽然可以表达到300多位十进制数,但其精度损失很大,不能用于高精度计算,即使是long或者 __int64类型也只能表达【-2^63,2^63-1】的数据,所以高精度的大数减法计算需要通过数组模拟减法的过程。

①:比较两个数的大小(非负数),通过长度判断大小,若长度相等,使用strcmp比较,把结果(-1、0、1)存入res,相等直接跳出。

②:a数组和b数组逆序。

③:从较小的数(b数组)开始相减。

④:接下来在a数组考虑借位的情况。

⑤:将前导0除去。

⑥:若结果为负数,加上负号。

⑦:在数组最后以 ‘\0’ 结尾。

⑥:逆序回正常。

#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;
}