这是 #1:
输入:
a + (1 +5)
8
((a + 1 + 5))
1 + 5 + a
a + a + 1 + 1 + 5 + 6
a-(a + 1) + 1+1+5+12-12 +6-6+a-(8 -8)
1023 + a + 5 - 1022
6 -(6-(9-(9-(8-(5+8))))) -(a -5) +a +1+5+a
9+9+4+6+9+1-9-5-1-(8-7)
9999 + 9999+9999+9999-(9999 + 9999+9999+9999)+a+ 5
输出:
ABDEF
我的程序输出:
ABDEF
显示在第三列读到了C? 难道是因为linux下的换行符和Windows不同吗?求大佬解答
附上代码:
#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int MAX=1e3+10;
const int MOD=998244353;
inline char readchar() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}
inline int read() {
#define readchar getchar
int res = 0, f = 0;
char ch = readchar();
for(; !isdigit(ch); ch = readchar()) if(ch == '-') f = 1;
for(; isdigit(ch);ch = readchar()) res = (res << 1) + (res << 3) + (ch ^ '0');
return f ? -res : res;
}
inline void write(int x) {
if(x<0){putchar('-');x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
string ss,ss1;
int ans[20],nb[300];
int ksm(int ds,int zs)
{
int ret=1;
while(zs)
{
if(zs&1) ret=(ret*ds)%MOD;
ds=(ds*ds)%MOD;zs>>=1;
}
return ret;
}
int calc(string s,int l,int r,int a)
{
int yxj=0,jl=0,mn=MOD;
// cout<<l<<" "<<r<<endl;
for(int i=r,noww=MOD;i>=l;i--)
{
if(isdigit(s[i])||s[i]=='a') continue;//不是运算符
if(s[i]==')') yxj+=100;
if(s[i]=='(') yxj-=100;
noww=yxj+nb[s[i]];
if(mn>noww&&s[i]!='('&&s[i]!=')') mn=noww,jl=i;
// cout<<i<<" "<<noww<<endl;
}
// cout<<jl<<endl;
if(!jl)
{
int ret=0;
for(int i=l;i<=r;i++) if(s[i]=='a') return a;
for(int i=l;i<=r;i++) if(isdigit(s[i])) ret=ret*10+s[i]-'0';
// cout<<ret<<endl;
return ret;
}
else
{
if(s[jl]=='^') return ksm(calc(s,l,jl-1,a),calc(s,jl+1,r,a));
if(s[jl]=='-') return (calc(s,l,jl-1,a)-calc(s,jl+1,r,a))%MOD;
if(s[jl]=='+') return (calc(s,l,jl-1,a)+calc(s,jl+1,r,a))%MOD;
if(s[jl]=='*') return (calc(s,l,jl-1,a)*calc(s,jl+1,r,a))%MOD;
}
return 0;
}
signed main()
{
getline(cin,ss);ss=" "+ss;
int n=read();
ss1=" ";
nb['+']=1;nb['-']=1;nb['*']=2;nb['^']=3;//优先级
for(int i=1;i<ss.size();i++) if(ss[i]!=' ') ss1=ss1+ss[i];
for(int i=0;i<=10;i++) ans[i]=calc(ss1,1,ss1.size()-1,i);
for(int i=1;i<=n;i++)
{
string s,s1=" ";
getline(cin,s);
s=" "+s;
for(int j=1;j<s.size();j++) if(s[j]!=' ') s1=s1+s[j];
int f=0;
for(int j=0;j<=10;j++)
{
int t1=calc(s1,1,s1.size()-1,j);
// cout<<t1<<endl;
if(t1!=ans[j]){f=1;break;}
}
if(!f) cout<<char('A'+i-1);
}
return 0;
}