Chinaunix首页 | 论坛 | 博客
  • 博客访问: 188866
  • 博文数量: 54
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 630
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-02 18:41
文章分类

全部博文(54)

文章存档

2011年(1)

2009年(30)

2008年(23)

我的朋友

分类: C/C++

2009-03-27 22:23:22

问题:
Time Limit: 1000MS  Memory Limit: 20000K
Description
Calculate A-B

Input
Two integer a and b(-10^100 < a,b < 10^100)

Output
Output a-b

Sample Input

1 2


Sample Output

-1


Source
BUPT Online Judge
 

#include <stdio.h>
#include <string.h>

int main()
{
    char num_1[102], num_2[102], result[102];    //处理100位数,增加两位分别作符号位和最后一位'\0'

    scanf("%s %s", num_1, num_2);

    int start_1 = 0, start_2 = 0, start_r = 0;        //最高位下标


    int len_1=0, len_2=0;                //位数

    bool sign_1=true, sign_2=true;        //符号位,正数为真,负数为假

    num_1[0] == '-' ?    sign_1 = false, len_1 = strlen(num_1)-1, start_1 = 1 : len_1 = strlen(num_1);
    num_2[0] == '-' ?    sign_2 = false, len_2 = strlen(num_2)-1, start_2 = 1 : len_2 = strlen(num_2);

    int     index_1 = start_1, index_2 = start_2;        //计算时的下标索引,初始时指向最高位


    int compare = 0;                    //两数绝对值比较结果,0——相等,-1——小于,1——大于

    int i = 0;
    if (len_1 == len_2)        //长度相等

    {
        for( ; i < len_1; i++)        //按位比较大小

        {
            if(num_1[index_1] > num_2[index_2])
            {
                compare = 1;
                break;
            }
            else if(num_1[index_1] < num_2[index_2])
            {
                compare = -1;
                break;
            }
            else
                compare = 0;

            index_1++;
            index_2++;
        }
    }
    else                    //长度不等

        len_1 > len_2 ?    compare = 1 : compare = -1;

    bool isBeyond = false;            //进位或借位标识


    if (sign_1 == sign_2)                //同号

    {
        index_1 = start_1 + len_1 -1;
        index_2 = start_2 + len_2 -1;

        switch(compare)
        {
        case    -1:

        case    0:                    //被减数绝对值小于等于减数

            for( ; index_1 >= start_1; index_1--, index_2-- )
            {
                result[index_2] = num_2[index_2] - num_1[index_1] + '0';
                if(isBeyond)                //如果小一位有借位

                    result[index_2]--;
                if(result[index_2] < '0')
                {
                    isBeyond = true;
                    result[index_2] += 10;
                }
                else
                    isBeyond = false;
            }
            while(index_2 >= start_2)
            {
                if(isBeyond)
                    result[index_2] = num_2[index_2] - 1;
                else
                    result[index_2] = num_2[index_2];
                if(result[index_2] < '0')
                {
                    isBeyond = true;
                    result[index_2] = '9';
                }
                else
                    isBeyond = false;

                index_2--;
            }

            result[start_2 + len_2] = '\0';        //字符串结束字符

            if(sign_1)                //如果被减数为正,则减数为正,结果为负

            {                
                //格式字符串,result[0]='-'

                for( i = 0; i < start_2 + len_2; i++)
                    if(result[i] != '0')
                    {
                        start_r = i;
                        break;
                    }
                if(start_r > 1)
                    for( i = start_r; i <= start_2 + len_2; i++)
                        result[i - start_r + 1] = result[i];
                else if(start_r == 0)
                    for( i = start_2 + len_2; i >= start_r; i--)
                        result[i - start_r + 1] = result[i];
                result[0] = '-';
            }
            else                    //如果被减数为负,则减数为负,结果为正

            {
                //格式字符串

                for( i = 1; i < start_2 + len_2; i++ )
                    if(result[i] != '0')
                    {
                        start_r = i;
                        break;
                    }
                for( i = start_r; i <= start_2 + len_2; i++)
                    result[i - start_r] = result[i];
            }
            break;

        case    1:
            for( ; index_2 >= start_2; index_1--, index_2-- )
            {
                result[index_1] = num_1[index_1] - num_2[index_2] + '0';
                if(isBeyond)                //如果小一位有借位

                    result[index_1]--;
                if(result[index_1] < '0')
                {
                    isBeyond = true;
                    result[index_1] += 10;
                }
                else
                    isBeyond = false;
            }
            while(index_1 >= start_1)
            {
                if(isBeyond)
                    result[index_1] = num_1[index_1] - 1;
                else
                    result[index_1] = num_1[index_1];
                if(result[index_1] < '0')
                {
                    isBeyond = true;
                    result[index_1] = '9';
                }
                else
                    isBeyond = false;

                index_1--;
            }

            result[start_1 + len_1] = '\0';        //字符串结束字符

            if(sign_1)                //如果被减数为正,则减数为正,结果为正

            {                
                //格式字符串

                for( i = 0; i < start_1 + len_1; i++)
                    if(result[i] != '0')
                    {
                        start_r = i;
                        break;
                    }
                for( i = start_r; i <= start_1 + len_1; i++)
                    result[i - start_r] = result[i];
            }
            else                    //如果被减数为负,则减数为负,结果为负

            {
                //格式字符串,result[0]='-'

                for( i = 1; i < start_1 + len_1; i++)
                    if(result[i] != '0')
                    {
                        start_r = i;
                        break;
                    }
                for( i = start_r; i <= start_1 + len_1; i++)
                    result[i - start_r + 1] = result[i];
                result[0] = '-';
            }
            break;

        default:
            break;
        }
    }
    else                                //异号

    {
        index_1 = start_1 + len_1 -1;
        index_2 = start_2 + len_2 -1;

        switch(compare)
        {
        case    -1:

        case    0:                    //被减数绝对值小于等于减数

            for( ; index_1 >= start_1; index_1--, index_2-- )
            {
                result[index_2] = num_1[index_1] + num_2[index_2] - '0';
                if(isBeyond)                //如果小一位有进位

                    result[index_2]++;
                if(result[index_2] > '9')
                {
                    isBeyond = true;
                    result[index_2] -= 10;
                }
                else
                    isBeyond = false;
            }
            while(index_2 >= start_2)
            {
                if(isBeyond)
                    result[index_2] = num_2[index_2] + 1;
                else
                    result[index_2] = num_2[index_2];
                if(result[index_2] > '9')
                {
                    isBeyond = true;
                    result[index_2] = '0';
                }
                else
                    isBeyond = false;

                index_2--;
            }

            result[start_2 + len_2] = '\0';        //字符串结束字符

            if(sign_1)                //如果被减数为正,则减数为负,结果为正

            {
                if(isBeyond)        //最高位进位

                {
                    result[0] = '1';
                }
                else                //最高位不进位,result中所有元素前移1位

                    for( i = 1; result[i-1] != '\0'; i++)
                    {
                        result[i-1] = result[i];
                    }
            }
            else                    //如果被减数为负,则减数为正,结果为负

            {
                if(isBeyond)        //最高位进位,result中所有元素后移2位,result[0]='-',result[1]='1'

                {
                    for( i = start_2 + len_2; i >= start_2; i--)
                    {
                        result[i+2] = result[i];
                    }
                    result[1] = '1';
                }
                else                //最高位不进位,result中所有元素后移1位,result[0]='-'

                    for( i = start_2 + len_2; i >= start_2; i--)
                        result[i+1] = result[i];
                result[0] = '-';
            }
            break;

        case    1:                    //被减数绝对值大于减数

            for( ; index_2 >= start_2; index_1--, index_2-- )
            {
                result[index_1] = num_1[index_1] + num_2[index_2] - '0';
                if(isBeyond)                //如果小一位有进位

                    result[index_1]++;
                if(result[index_1] > '9')
                {
                    isBeyond = true;
                    result[index_1] -= 10;
                }
                else
                    isBeyond = false;
            }
            while(index_1 >= start_1)
            {
                if(isBeyond)
                    result[index_1] = num_1[index_1] + 1;
                else
                    result[index_1] = num_1[index_1];
                if(result[index_1] > '9')
                {
                    isBeyond = true;
                    result[index_1] = '0';
                }
                else
                    isBeyond = false;

                index_1--;
            }

            result[start_1 + len_1] = '\0';        //字符串结束字符

            if(sign_1)                //如果被减数为正,则减数为负,结果为正

            {
                if(isBeyond)        //最高位进位,result中所有元素后移1位,result[0]='1'

                {
                    for( i = start_1 + len_1; i >= start_1; i--)
                    {
                        result[i+1] = result[i];
                    }
                    result[0] = '1';
                }
                else                //最高位不进位,什么也不做

                    NULL;
            }
            else                    //如果被减数为负,则减数为正,结果为负

            {
                if(isBeyond)        //最高位进位,result中所有元素后移2位,result[0]='-',result[1]='1'

                {
                    for( i = start_1 + len_1; i >= start_1; i--)
                    {
                        result[i+2] = result[i];
                    }
                    result[1] = '1';
                }
                else                //最高位不进位,result[0]='-'

                    NULL;
                result[0] = '-';
            }
            break;

        default:
            break;
        }
    }
    printf("%s\n", result);

    return 0;
}

阅读(1181) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~