欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大整数加减法(基础,细节题型)

程序员文章站 2024-03-23 15:58:34
...

大数加法

51Nod - 1005

给出2个大整数A,B,计算A+B的结果。
Input

第1行:大数A
第2行:大数B
(A,B的长度 <= 10000 需注意:A B有可能为负数)
Output

输出A + B
Sample Input

68932147586
468711654886
Sample Output

537643802472

这个题的意思很简单,如上所述,其实就是让你写两个 用字符串计算 正数加法和减法的函数,这两个函数 的原理 和 大致的模型是一样的 ,函数如下 ,大家可以对比一下这两个函数,其实原理很简单,就是将平时我们在演草纸上进行的加法运算或者剑法运算用字符串的形式表示出来就行了,这里需要注意一下一些细节: 加法中的进位和减法中的借位(自己起的名字,我也不太清楚叫什么,嘿嘿)。代码如下,这个代码本来是可以再优化一下的, 但是我就得这个比较详细,比较适合大家理解代码所以就没有进行优化,代码虽然有点长,但是 其中两个函数大概是一样的,而且主函数就是分了几种结果的类型,很好理解的哟!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int cmp(char *a, char *b)// 比较 连个数字字符串所对应的数字的大小
{
    int a_len = strlen(a);
    int b_len = strlen(b);
    if(a_len > b_len)
        return 1;
    else if(a_len < b_len)
        return -1;
    else
        return strcmp(a, b);
}

void Add(char *a, char *b)
{
    int a_len = strlen(a);
    int b_len = strlen(b);
    int maxlen = max(a_len, b_len);
    int m = 0, n = 0;               //m  n  表示位上的数字
    int c = 0, i;                   //c 表示 进位
    char *p = new char[maxlen + 2];  //储存结果
    char *pa = a + a_len - 1;
    char *pb = b + b_len - 1;

    for(i = 0; i < maxlen; i++)
    {
        m = n = 0;
        if(pa+1 != a)
        {
            m = *pa - 48;           // 0  的Asic 是 48
            pa--;
        }
        if(pb+1 != b)
        {
            n = *pb - 48;
            pb--;
        }
        *(p+i) = (m + n + c) % 10 + 48;//将结果转化为字符串进行存储
        c = (m + n + c) / 10;
    }

    if(c > 0)   // 表示最后一位还有进位
    {
        *(p+i) = c + 48;
        *(p+i+1) = '\0';
    }
    else
        *(p+i) = '\0';

    int p_len = strlen(p);
    int flag = 0;
    for(int j = p_len - 1; j >= 0; j--)
    {
        if(*(p+j) > '0') flag = 1;
        if(flag == 1)
            printf("%c", *(p+j));
    }
    if(p_len == 1 && p[0] == '0')
        printf("0");
    cout<<endl;
}

void Sub(char *a, char *b)
{
    int a_len = strlen(a);
    int b_len = strlen(b);
    int maxlen = max(a_len, b_len);
    int m = 0, n = 0;
    int c = 0, i;
    char *p = new char[maxlen + 2];
    char *pa = a + a_len - 1;
    char *pb = b + b_len - 1;

    for(i = 0; i < maxlen; i++)
    {
        m = n = 0;
        if(pa + 1 != a)
        {
            m = *pa - 48;
            pa--;
        }
        if(pb + 1 != b)
        {
            n = *pb - 48;
            pb--;
        }
        m -= c;
        if(m < n)  m += 10, c = 1;
        else c = 0;
        *(p+i) = m - n + 48;

    }
    *(p+i) = '\0';

    int p_len = strlen(p);
    int flag = 0;
    for(int j = p_len - 1; j >= 0; j--)
    {
        if(*(p+j) > '0') flag = 1;
        if(flag == 1)
            printf("%c", *(p+j));
    }
    cout<<endl;
}

int main()
{
    char a[10010], b[10010];

    gets(a);
    gets(b);

    if(a[0] != '-' && b[0] != '-')
        Add(a, b);
    else if(a[0] == '-' && b[0] == '-')
    {
        printf("-");
        Add(a+1, b+1);
    }
    else if(a[0] != '-' && b[0] == '-')
    {
        if(cmp(a, b+1) < 0)
        {
            printf("-");
            Sub(b+1, a);
        }
        else if(cmp(a, b+1) > 0)
            Sub(a, b+1);
        else
            printf("0\n");
    }
    else if(a[0] == '-' && b[0] != '-')
    {
        if(cmp(b, a+1) < 0)
        {
            printf("-");
            Sub(a+1, b);
        }
        else if(cmp(b, a+1) > 0)
            Sub(b, a+1);
        else
            printf("0\n");
    }


    return 0;
}
相关标签: 大整数加法