站长网 大数据 51Nod-1005-大数加法

51Nod-1005-大数加法

副标题#e# 今天遇见一道细节问题特别多的题,写得我眼疼,题本身不难,难得是他的细节问题繁多,需要考虑的情况也甚多,稍有不慎就侧漏了,哈哈。题的思路也很清晰,就是将最后的结果的正负的符号分离出来,剩下的就是高精度的加减法了,利用字符串处理即可

副标题#e#

今天遇见一道细节问题特别多的题,写得我眼疼,题本身不难,难得是他的细节问题繁多,需要考虑的情况也甚多,稍有不慎就侧漏了,哈哈。
题的思路也很清晰,就是将最后的结果的正负的符号分离出来,剩下的就是高精度的加减法了,利用字符串处理即可,效率可以很高很高,有多高呢?自己感觉吧!

题:
给出2个大整数A,B,计算A+B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output
输出A + B
Input示例
68932147586
468711654886
Output示例
537643802472

题寥寥数行,看着很简单,其实思路真的很简单,但是我这粗心鬼,整整做了一个小时,因为自己粗心,总是忽略了很多的细节问题,频频出错,好在最后都改正了过来,代码如下。
代码C:
#include <stdio.h>
#include <string.h>
#define _MAX 10005
int product[_MAX] = {0};
char numOne[_MAX] = {0},numTwo[_MAX] = {0};
char numOneUp[_MAX] = {0},numTwoUp[_MAX] = {0};    //倒序存储位置
int absMax = 1;
//递归进位函数
void Carrying(int tag,int i,int *p)
{
    p[i] += tag;
    if (p[i] > 9)
    {
        tag = 1;
        p[i] -= 10;
        Carrying(tag,i + 1,p);    //写成Carrying(tag,i,j+1,p);也成立,为了让i+j递增而已
    }
    return ;
}

//递归退位函数
void Abdicate(int tag,int *p)
{
    p[i] += tag;
    if (p[i] < 0)
    {
        tag = -1;
        p[i] += 10;
        Abdicate(tag,p);
    }
    return ;
}

//判断大小
void size(int numOneLen,int numTwoLen)
{
    int i,j;
    if (numOneLen < numTwoLen)
    {
        absMax = 2;
        for (i = 0; i < numTwoLen; i++)
        {
            numOneUp[i] ^= numTwoUp[i];
            numTwoUp[i] ^= numOneUp[i];
            numOneUp[i] ^= numTwoUp[i];
        }
        return ;
    }
    if (numOneLen == numTwoLen)
    {
        for (i = numOneLen - 1; i >= 0; i--)
        {
            if (numOneUp[i] < numTwoUp[i])
            {
                absMax = 2;
                for (j = 0; j < numTwoLen; j++)
                {
                    numOneUp[j] ^= numTwoUp[j];
                    numTwoUp[j] ^= numOneUp[j];
                    numOneUp[j] ^= numTwoUp[j];
                }
                return ;
            }
            else if (numOneUp[i] > numTwoUp[i])
            {
                return ;
            }
        }
    }
    return ;
}

//加减处理
void addOrSub(int numOneLen,int numTwoLen,int flag)   //flag加法为1减法为0
{
    int i,key = 0,tag,numLenMax,numLenMin;
    numOneLen = numOneLen - 1;
    numTwoLen = numTwoLen - 1;
    //数据逆序
    for (i = numOneLen; i > 0; i--)
    {
        numOneUp[key++] = numOne[i];
    }
    if (numOne[0] != '-')
    {
        numOneUp[key] = numOne[0];
        numOneLen++;
    }
    key = 0;
    for (i = numTwoLen; i > 0; i--)
    {
        numTwoUp[key++] = numTwo[i];
    }
    if (numTwo[0] != '-')
    {
        numTwoUp[key] = numTwo[0];
        numTwoLen++;
    }
    numLenMax = numOneLen > numTwoLen ? numOneLen : numTwoLen;
    numLenMin = numOneLen < numTwoLen ? numOneLen : numTwoLen;
    //逐位相加
    if (flag)
    {
        size(numOneLen,numTwoLen);
        for (i = 0; i < numLenMax; i++)
        {
            product[i] = (int)numOneUp[i] - 48;
        }
        for (i = 0; i < numLenMin; i++)
        {
            tag = (int)numTwoUp[i]-48;
            Carrying(tag,product);                          //递归
        }
    }
    //逐位相减
    else
    {
        size(numOneLen,numTwoLen);
        for (i = 0; i < numLenMax; i++)
        {
            product[i] = (int)numOneUp[i] - 48;
        }
        for (i = 0; i < numLenMin; i++)
        {
            tag = -((int)numTwoUp[i]-48);
            Abdicate(tag,product);                          //递归
        }
    }
}

//输出结果
void print()
{
    int i,j;
    //倒序输出结果
    for (i = _MAX - 1; i > 0; i--)
    {
        if (product[i] != 0)
        {
            break;                               //查找到第一个不等于0的跳出
        }
    }
    for (j = i; j >= 0; j--)
    {
        printf("%d",product[j]);
    }
    printf("\n");
}

int main(int argc,const char * argv[])
{
    int numOneLen,numTwoLen;

    scanf("%s %s",numOne,numTwo);                    //存数据

    numOneLen=(int)strlen(numOne);
    numTwoLen=(int)strlen(numTwo);

    if (numOne[0] == '-' && numTwo[0] == '-')
    {
        addOrSub(numOneLen,numTwoLen,1);
        printf("-");
        print();
    }
    else if (numOne[0] == '-' || numTwo[0] == '-')
    {
        addOrSub(numOneLen,0);
        if ((numOne[0] == '-' && absMax == 1) || (numTwo[0] == '-' && absMax == 2))
        {
            printf("-");
        }
        print();
    }
    else
    {
        addOrSub(numOneLen,1);
        print();
    }
    return 0;
}

#p#副标题#e##p#分页标题#e#

也就这样吧,这道题锻炼的是个人的编程基本功底和粗心程度!有点意思-_-#OVER!!!

本文来自网络,不代表站长网立场,转载请注明出处:https://www.zwzz.com.cn/html/shuju/2021/0527/7139.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部