当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 高精度减法运算

高精度减法运算

2018年02月08日  | 移动技术网IT编程  | 我要评论

僵尸小子之僵尸兵团,胆小别看,爱情中毒吻戏

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

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网