zoukankan      html  css  js  c++  java
  • 实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!

    //实现大整数相加
    //还得考虑符号位,一个比另一个短
    #include<iostream>
    #include <string>
    #include <cstring>
    
    using namespace std;
    #define maxlen 2001
    int a[maxlen];
    int b[maxlen];
    int len1, len2, i, j;
    
    int bigger(int a, int b)
    {
        return a>b ? a : b;
    }
    
    void Add(int underzero)
    {
        if (underzero)
            cout << '-';
        int big = bigger(len1, len2);
        for (i = 0; i <= big; i++)
        {
            a[i] += b[i];
            if (a[i] >= 10)
            {
                a[i] -= 10;
                a[i + 1]++;
            }
        }
    
        bool flag = false;//用来忽略高位的0,中间的0才是有效数字
        for (i = big; i >= 0; i--)
        {
            if (flag)
                cout << a[i];
            else if (a[i])
            {
                cout << a[i];
                flag = true;
            }
        }
        cout << endl;
    }
    
    void Minus(int aa[], int bb[], int biglen, int underzero)
    {
        if (underzero)
            cout << '-';
        for (i = 0; i <= biglen; i++)
        {
            if (aa[i] >= bb[i])
                aa[i] -= bb[i];
            else
            {
                aa[i] = aa[i] + 10 - bb[i];
                aa[i + 1]--;
            }
        }
    
        bool flag = false;//同样去掉最高位的无效‘1’
        for (i = biglen; i >= 0; i--)
        {
            if (flag)
                cout << aa[i];
            else if (aa[i])
            {
                cout << aa[i];
                flag = true;
            }
        }
        cout << endl;
    }
    
    int main()
    {
        string s1, s2;
        bool success;
        while (cin >> s1 >> s2)
        {
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            len1 = s1.length();
            len2 = s2.length();
    
            for (i = len1 - 1, j = 0; i>0; i--)
                a[j++] = s1[i] - '0';
            if (s1[0] != '-')
                a[j] = s1[0] - '0';
            for (i = len2 - 1, j = 0; i>0; i--)
                b[j++] = s2[i] - '0';
            if (s2[0] != '-')
                b[j] = s2[0] - '0';
    
            if (s1[0] == '-' && s2[0] == '-')
                Add(1);  //和为负
            else if (s1[0] != '-' && s2[0] != '-')
                Add(0);  //和为正
            else if (s1[0] == '-')
            {
                if (len1 - 1 > len2) //负数大
                    Minus(a, b, len1 - 1, 1);
                else if (len1 - 1 < len2) //正数大
                    Minus(b, a, len2, 0);
                else
                {
                    success = true;
                    for (i = len1 - 2, j = len2 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                    {
                        if (a[i]>b[j]) //负数大
                        {
                            success = false;
                            Minus(a, b, len2, 1);
                            break;
                        }
                        else if (a[i]<b[j]) //正数大
                        {
                            success = false;
                            Minus(b, a, len2, 0);
                            break;
                        }
                    }
                    if (success) //相等
                        cout << "0" << endl;
                }
            }
            else if (s2[0] == '-')
            {
                if (len2 - 1 > len1) //负数大
                    Minus(b, a, len2 - 1, 1);
                else if (len2 - 1 < len1) //正数大
                    Minus(a, b, len1, 0);
                else
                {
                    success = true;
                    for (i = len2 - 2, j = len1 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                    {
                        if (a[j]>b[i]) //正数大
                        {
                            success = false;
                            Minus(a, b, len1, 0);
                            break;
                        }
                        else if (a[j]<b[i]) //负数大
                        {
                            success = false;
                            Minus(b, a, len1, 1);
                            break;
                        }
                    }
                    if (success) //相等
                        cout << "0" << endl;
                }
            }
        }
        return 0;
    }
    //实现大整数相加
    //还得考虑符号位,一个比另一个短
    #include<iostream>
    #include <string>
    #include <cstring>
    
    using namespace std;
    #define maxlen 2001
    int a[maxlen];
    int b[maxlen];
    int len1, len2, i, j;
    
    int bigger(int a, int b)
    {
        return a>b ? a : b;
    }
    
    void Add(int underzero)
    {
        if (underzero)
            cout << '-';
        int big = bigger(len1, len2);
        for (i = 0; i <= big; i++)
        {
            a[i] += b[i];
            if (a[i] >= 10)
            {
                a[i] -= 10;
                a[i + 1]++;
            }
        }
    
        bool flag = false;//用来忽略高位的0,中间的0才是有效数字
        for (i = big; i >= 0; i--)
        {
            if (flag)
                cout << a[i];
            else if (a[i])
            {
                cout << a[i];
                flag = true;
            }
        }
        cout << endl;
    }
    
    void Minus(int aa[], int bb[], int biglen, int underzero)//数组的元素下标从小到大对应大整数(低位->高位)哪一个数的绝对值大,那个数就放前面,underzero=1表示最终结果为负数
    {
        if (underzero)
            cout << '-';
        for (i = 0; i <= biglen; i++)
        {
            if (aa[i] >= bb[i])
                aa[i] -= bb[i];
            else
            {
                aa[i] = aa[i] + 10 - bb[i];
                aa[i + 1]--;
            }
        }
    
        bool flag = false;//同样去掉最高位的无效‘1’
        for (i = biglen; i >= 0; i--)
        {
            if (flag)
                cout << aa[i];
            else if (aa[i])
            {
                cout << aa[i];
                flag = true;
            }
        }
        cout << endl;
    }
    
    int main()
    {
        string s1, s2;
        bool success;
        while (cin >> s1 >> s2)
        {
            memset(a, 0, sizeof(a));
            memset(b, 0, sizeof(b));
            len1 = s1.length();
            len2 = s2.length();
    
            for (i = len1 - 1, j = 0; i>0; i--)//将大整数的最低位(个位)存入到数组下标最小的位置
                a[j++] = s1[i] - '0';
            if (s1[0] != '-')
                a[j] = s1[0] - '0';
            for (i = len2 - 1, j = 0; i>0; i--)
                b[j++] = s2[i] - '0';
            if (s2[0] != '-')
                b[j] = s2[0] - '0';
    
            if (s1[0] == '-' && s2[0] == '-')
                Add(1);  //和为负
            else if (s1[0] != '-' && s2[0] != '-')
                Add(0);  //和为正
            else if (s1[0] == '-')
            {
                if (len1 - 1 > len2) //负数大
                    Minus(a, b, len1 - 1, 1);
                else if (len1 - 1 < len2) //正数大
                    Minus(b, a, len2, 0);
                else
                {
                    success = true;
                    for (i = len1 - 2, j = len2 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                    {
                        if (a[i]>b[j]) //负数大
                        {
                            success = false;
                            Minus(a, b, len2, 1);
                            break;
                        }
                        else if (a[i]<b[j]) //正数大
                        {
                            success = false;
                            Minus(b, a, len2, 0);
                            break;
                        }
                    }
                    if (success) //相等
                        cout << "0" << endl;
                }
            }
            else if (s2[0] == '-')
            {
                if (len2 - 1 > len1) //负数大
                    Minus(b, a, len2 - 1, 1);
                else if (len2 - 1 < len1) //正数大
                    Minus(a, b, len1, 0);
                else
                {
                    success = true;
                    for (i = len2 - 2, j = len1 - 1; j >= 0; j--, i--) //这里的len-2是个关键,len-1是长度,之所以再减去1,是要减去负号的位置
                    {
                        if (a[j]>b[i]) //正数大
                        {
                            success = false;
                            Minus(a, b, len1, 0);
                            break;
                        }
                        else if (a[j]<b[i]) //负数大
                        {
                            success = false;
                            Minus(b, a, len1, 1);
                            break;
                        }
                    }
                    if (success) //相等
                        cout << "0" << endl;
                }
            }
        }
        return 0;
    }
    View Code
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    codeforces C. No to Palindromes!
    codeforces D. Pashmak and Parmida's problem
    codeforces C. Little Pony and Expected Maximum
    codeforces D. Count Good Substrings
    codeforces C. Jzzhu and Chocolate
    codeforces C. DZY Loves Sequences
    codeforces D. Multiplication Table
    codeforces C. Painting Fence
    hdu 5067 Harry And Dig Machine
    POJ 1159 Palindrome
  • 原文地址:https://www.cnblogs.com/chess/p/5331340.html
Copyright © 2011-2022 走看看