高精度减法运算

发布日期:2018-02-08    浏览次数:903

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

 

0

上一篇: C++闭包

下一篇: P1430 序列取数

本文网址:https://www.wyxxw.cn/blog-detail-8-11-105.html

返回列表

非特殊说明,本文版权归原作者所有,转载请注明出处

提示:本站所有资源仅供学习与参考,请勿用于商业用途。图片来自互联网~如侵犯您的权益,请联系QQ:1067507709.

提示:转载请注明来自:https://www.cnblogs.com/kannyi/p/8428493.html 。 转载人:momo