最近刷到一道字符串的题,难度倒不是很大,就是输入时非常之“恶心”。

先看题:

关于洛谷评测不喜欢getline这件事……_洛谷和getline

由于每行输入几个数据是不确定的(有时2,有时3),因此我最先想到的是用getline,可以处理一整行的输入,提交上去,结果,结果,他就全部“re”了。当时很奇怪,以为我的代码算法有了问题,后来经过查阅资料和再三确认后,问题发现是getline的问题。

原因:洛谷测评系统搭建在Linux系统

关于洛谷评测不喜欢getline这件事……_处理方法_02

处理方法:

就是不用getline了。那用啥呢,有人说用sscanf等等的函数,但我看起来不太舒畅,感觉稍微有点“小题大做”。

于是我就有了以下的“简易版”解法:

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

typedef long long ll;

string f(ll x)
{
string ans,flag="";
if(x==0)
{
return "0";
}
if(x<0)
{
flag="-";
x*=-1;
}
while(x)
{
ll y=x%10;
ans+='0'+y;
x/=10;
}
reverse(ans.begin(),ans.end());
return flag+ans;
}

ll g(string x)
{
ll flag=1,index=0;
if(x[0]=='-')
{
flag=-1;
index=1;
}
ll sum=0;
for(ll i=index; i<x.size(); i++)
{
sum=sum*10+(x[i]-'0');
}
return flag*sum;
}

int main()
{
ll i;
cin>>i;
string last="a";
while(i--)
{
string c,a,b="";
cin>>c>>a;
if(c=="a"||c=="b"||c=="c")
{
cin>>b;
}
if(b!="")
{
string op=c;
ll x=g(a);
ll y=g(b);
string ans;
if(op=="a")
{
ll z=x+y;
ans=a+"+"+b+"="+f(z);
}
else if(op=="b")
{
ll z=x-y;
ans=a+"-"+b+"="+f(z);
}
else
{
ll z=x*y;
ans=a+"*"+b+"="+f(z);
}
last=op;
cout<<ans<<endl<<ans.size()<<endl;
}
else
{
string op=last;
ll x=g(c);
ll y=g(a);
string ans;
if(op=="a")
{
ll z=x+y;
ans=c+"+"+a+"="+f(z);
}
else if(op=="b")
{
ll z=x-y;
ans=c+"-"+a+"="+f(z);
}
else
{
ll z=x*y;
ans=c+"*"+a+"="+f(z);
}
// last=op;
cout<<ans<<endl<<ans.size()<<endl;
}
}
return 0;
}

关于洛谷评测不喜欢getline这件事……_数据_03

请看这张图,我的思路,先输入2个元素,因为他俩一定存在,然后判断第一个字符是不是a~c其中之一的字符,如果是,那么继续输入1元素,否则,结束本行输入。

怎么样,是不是比较简单?但是过程很艰辛,期间我试过很多种方法,就这种存活了下来。今天就分享给大家啦。