3115 高精度练习之减法——http://codevs.cn/problem/3115/

第一部分:题目

题目描述 Description

给出两个正整数A和B,计算A-B的值。保证A和B的位数不超过500位。

输入描述 Input Description

读入两个用空格隔开的正整数

输出描述 Output Description

输出A-B的值

样例输入 Sample Input

3 12

样例输出 Sample Output

-9

数据范围及提示 Data Size & Hint

两个正整数的位数不超过500位

第二部分:思路

 具体看代码注释

第三部分:代码

 

#include<stdio.h>
#include<string.h>
void repai(char s[500],int len)//把数组倒置 
{
    int i,j=len-1;
    char t;
    for(i=0;i<j;i++)
    {
        j=len-i-1;//相当于以中点对折。 
        t=s[i];
        s[i]=s[j];
        s[j]=t;
    }
}
void compute(char a[500],int alen,char b[500],int blen,char sign)//进行减法计算 
{
    int result[501],length=0;
    int i,j,flag=0;
    repai(a,alen);//倒置 
    repai(b,blen);
    int t;
    for(i=0;i<alen&&i<blen;i++)//从个位开始相减 
    {
        t=a[i]-b[i]+flag;
        if(t<0)//判断是否需要借1 
        {
            t+=10;
            flag=-1;
        }
        else//这里稍微注意一下,当前不需要借1时置为0 
        {
            flag=0;
        }
        result[length++]=t;
    }
    while(i<alen)
    {
        t=a[i]-'0'+flag;
        if(t<0)
        {
            t+=10;
            flag=-1;
        }
        else
        {
            flag=0;
        }
        result[length++]=t;
        i++;
    }
    while(i<blen)
    {
        t=b[i]-'0'+flag;
        if(t<0)
        {
            t+=10;
            flag=-1;
        }
        else
        {
            flag=0;
        }
        result[length++]=t;
        i++;
    }
    if(flag==-1||sign=='-')//差为负有两种情况:1.被减数比减数短。2.被减数与减数一样长,但小 
    {
        printf("-");
    }
    int begin=0;//用于减去前置0,比如123减120,数组中存的是003,00不要。 
    for(i=length-1;i>=0;i--)
    {
        if(result[i]==0&&begin==0)
        {
            begin=1;
        }
        else
        {
            begin=1;
            printf("%d",result[i]);
        }
    }
    printf("\n");
} 
int main()
{
    char a[500],b[500];//接收数a、b 
    scanf("%s %s",a,b);
    int alen,blen;
    alen=strlen(a);//数组a、b长度 
    blen=strlen(b);
    if(alen<blen)//数a比数b短,用b减a,差为负 
    {
        compute(b,blen,a,alen,'-');
    }
    else
    {
        if(alen==blen&&strcmp(a,b)<0)//两个数长度相同时就需要进行比较了,用大的减小的 
        {
            compute(b,blen,a,alen,'-');
        }
        else
        {
            compute(a,alen,b,blen,'+');
        }    
    }
    return 0;
}

 

posted @ 2016-04-11 23:37  喝醉的香锅锅  阅读(181)  评论(0编辑  收藏  举报