• 实现大整数相加(考虑符号位,可能有负整数) 思维严谨程度!!


    //实现大整数相加
    //还得考虑符号位,一个比另一个短
    #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
    手里拿着一把锤子,看什么都像钉子,编程界的锤子应该就是算法了吧!
  • 相关阅读:
    kubeadm快捷k8s集群
    常用my.cnf
    cka考试 列出命名空间下指定标签pod
    mysql 巡检项
    1、什么原因可能导致主从同步延时,怎么判断,怎么处理?
    Linux运维常用操作培训用例
    RMAN 还原与恢复
    常见网络故障及其维修方法
    Oracle ORA01654 解决方案
    Oracle中 dba_* 和 v$* 表区别
  • 原文地址:https://www.cnblogs.com/chess/p/5331340.html
Copyright © 2020-2023  润新知