小米OJ-19-大数的加法运算与大小判断

描述

对于给定的算术表达式,按规则输出计算结果,仅包含加法和大小判断。

输入

一行字符串,为加号、大于、小于( + < > ) 连接的两个不限大小的非负整数。

输出

当符号为 + 时, 计算两个数相加的和, 并以字符串格式返回; 当符号为 < 时, 如果左数小于右数, 返回大写字母字符 Y, 否则返回大写字母字符 N; 当符号为 > 时, 如果左数大于右数, 返回大写字母字符 Y, 否则返回大写字母字符 N。

!!!请同学们尽量使用算法来解决这个问题

输入样例

972919822976663297>74058
875098336507333719633571722631534917759993913379786689>53558270653237768027942884431075534537929401567824882097903948774409200
7625022925148127196027859399571498914361+790786706794530

输出样例

Y
N
7625022925148127196027860190358205708891


解析:这一题与第三题“大数相减”相似,多了大小的判断。核心都是模拟人工加减法来对存储在字符串中的数字进行运算。


而我的算法性能不是很理想原因可能是过多的封装和需要在长度较小的数前面补充“0”,而字符串在前面增加元素的代价很大。

#include<bits/stdc++.h>
using namespace std;

class fun
{
    public:
        void split(const string s);
        void addition(string astr , string bstr);
        void greater_than(string astr , string bstr);
        void less_than(string astr , string bstr);
    private:
        //保存结果
        string cstr;
}temp;

void fun::addition(string astr , string bstr)
{
    //进位
    int overflow = 0;
    //使两个字符串位数对齐
    while (astr.size()<bstr.size())
    {
        astr.insert(0,"0");
    }
    while (bstr.size()<astr.size())
    {
        bstr.insert(0,"0");
    }
    for(int i = (astr.size() - 1) ; i>=0 ; i--)
    {
        if(astr[i] + bstr[i] + overflow - '0' - '0' >= 10)
        {
            cstr += astr[i] + bstr[i] + overflow - 10 - '0';
            overflow = 1;
        }
        else
        {
            cstr += astr[i] + bstr[i] + overflow - '0';
            overflow = 0;
        }
    }

    //先看是否有溢出位需要输出,再倒序输出
    if(overflow == 1)
    {
        cout<<"1";
    }
    for(int i = 0; i < cstr.size(); i++){
        cout<<cstr[cstr.size()-1-i];
    }
    cout<<endl;
    cstr.clear();
}
void fun::greater_than(string astr , string bstr)
{
    //使两个字符串位数对齐
    while (astr.size()<bstr.size())
    {
        astr.insert(0,"0");
    }
    while (bstr.size()<astr.size())
    {
        bstr.insert(0,"0");
    }
    if(astr > bstr)
    {
        cout<<"Y"<<endl;
    }
    else
    {
        cout<<"N"<<endl;
    }
}
void fun::less_than(string astr , string bstr)
{
    //使两个字符串位数对齐
    while (astr.size()<bstr.size())
    {
        astr.insert(0,"0");
    }
    while (bstr.size()<astr.size())
    {
        bstr.insert(0,"0");
    }
    if(astr < bstr)
    {
        cout<<"Y"<<endl;
    }
    else
    {
        cout<<"N"<<endl;
    }
}

void fun::split(const string s)
{
    for(int i = 0; i < s.size(); i++)
    {
        if(s[i] < '0' || s[i] > '9')
        {
            string astr(s,0,i);
            string bstr(s,i+1);
            if(s[i] == '+')
            {
                fun::addition(astr,bstr);
            }
            else if(s[i] == '>')
            {
                fun::greater_than(astr,bstr);
            }
            else if(s[i] == '<')
            {
                fun::less_than(astr,bstr);
            }
            break;
        }
    }
}

int main()
{
    string input;
    while(getline(cin,input))
    {
        temp.split(input);
    }
    return 0;
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,669评论 0 5
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,627评论 0 4
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 6,277评论 0 10
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,924评论 0 2
  •   引用类型的值(对象)是引用类型的一个实例。   在 ECMAscript 中,引用类型是一种数据结构,用于将数...
    霜天晓阅读 1,200评论 0 1

友情链接更多精彩内容