描述
对于给定的算术表达式,按规则输出计算结果,仅包含加法和大小判断。
输入
一行字符串,为加号、大于、小于( + < > ) 连接的两个不限大小的非负整数。
输出
当符号为 + 时, 计算两个数相加的和, 并以字符串格式返回; 当符号为 < 时, 如果左数小于右数, 返回大写字母字符 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;
}