描述
對(duì)于給定的算術(shù)表達(dá)式,按規(guī)則輸出計(jì)算結(jié)果,僅包含加法和大小判斷。
輸入
一行字符串,為加號(hào)、大于、小于( + < > ) 連接的兩個(gè)不限大小的非負(fù)整數(shù)。
輸出
當(dāng)符號(hào)為 + 時(shí), 計(jì)算兩個(gè)數(shù)相加的和, 并以字符串格式返回; 當(dāng)符號(hào)為 < 時(shí), 如果左數(shù)小于右數(shù), 返回大寫字母字符 Y, 否則返回大寫字母字符 N; 當(dāng)符號(hào)為 > 時(shí), 如果左數(shù)大于右數(shù), 返回大寫字母字符 Y, 否則返回大寫字母字符 N。
!!!請(qǐng)同學(xué)們盡量使用算法來(lái)解決這個(gè)問(wèn)題
輸入樣例
972919822976663297>74058
875098336507333719633571722631534917759993913379786689>53558270653237768027942884431075534537929401567824882097903948774409200
7625022925148127196027859399571498914361+790786706794530
輸出樣例
Y
N
7625022925148127196027860190358205708891
解析:這一題與第三題“大數(shù)相減”相似,多了大小的判斷。核心都是模擬人工加減法來(lái)對(duì)存儲(chǔ)在字符串中的數(shù)字進(jìn)行運(yùn)算。
而我的算法性能不是很理想原因可能是過(guò)多的封裝和需要在長(zhǎng)度較小的數(shù)前面補(bǔ)充“0”,而字符串在前面增加元素的代價(jià)很大。
#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:
//保存結(jié)果
string cstr;
}temp;
void fun::addition(string astr , string bstr)
{
//進(jìn)位
int overflow = 0;
//使兩個(gè)字符串位數(shù)對(duì)齊
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)
{
//使兩個(gè)字符串位數(shù)對(duì)齊
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)
{
//使兩個(gè)字符串位數(shù)對(duì)齊
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;
}