整数加法

//------------------------------------整数加法---------------------------------//
/*
题目描述
请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回error
输入描述:
输入为一行,包含两个字符串,字符串的长度在[1,100]。
输出描述:
输出为一行。合法情况输出相加结果,非法情况输出error

示例1
输入
123 123
abd 123
输出
246
Error
*/
/*
    这个题最好用字符串做,用整数做的话很麻烦,主要是在数极大的情况下,由于计算机整
    数编码的问题,各种类型的数都有自己的范围。
    用字符串就不用考虑这些,进位也很好进行。
*/

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int f6()
{
    string str1, str2;
    cin >> str1 >> str2;
    bool b1 = true, b2 = true;
    //判断是否全为数
    for (const auto &i : str1)
        if (i < '0' || i > '9')
        {
            b1 = false;
            break;
        }
    for (const auto &i : str2)
        if (i < '0' || i > '9')
        {
            b2 = false;
            break;
        }
    //两者都是阿拉伯数字时
    if (b1 && b2)
    {
        int str1len = str1.size();
        int str2len = str2.size();
        int minlen = min(str1len, str2len);//求出最小长度
        int maxlen = max(str1len, str2len);//求出最大长度
        vector<int> v;
        reverse(str1.begin(), str1.end());//先反转两个字符串,为了后面加法
        reverse(str2.begin(), str2.end());
        //加法,先把位数小的数加到大数对应位置上
        for (int i = 0; i < minlen; ++i)
            v.push_back((str1[i] - '0') + (str2[i] - '0'));
        //大数大的位放进去
        for (int i = minlen; i < maxlen; ++i)
        {
            if (str1len > str2len)
                v.push_back(str1[i] - '0');
            else
                v.push_back(str2[i] - '0');
        }
        //进位,注意边界
        for (int i = 0; i < v.size() - 1; ++i)
        {
            if (v[i] >= 10)
            {
                v[i] -= 10;
                v[i + 1] += 1;
            }
        }
        //如果最高位依然进位,就push_back(1)
        if (v[v.size() - 1] >= 10)
        {
            v[v.size() - 1] -= 10;
            v.push_back(1);
        }
        //输出
        for (int i = v.size() - 1; i >= 0; --i)
            cout << v[i];
        cout << endl;
    }
    else
        cout << "error" << endl;
    return 0;
}

 

posted @ 2017-11-01 19:25  CoderZSL  阅读(270)  评论(0编辑  收藏  举报