给出一个三角表达式,问是否恒为零
训练的时候队友写了,后来wa,我读了读题感觉他写的没错。。稍微改了一点就对了。。迷
结束后自己复盘,又从头写了一遍这个题,总结下:
这个题分成两部分,一部分是正确处理这个表达式,用c++ stack来做就可以写的很清晰,另一个部分就是判断
首先,就按照它对于input的解释一点点把这个表达式压到栈里面就行,表达式处理完毕之后,栈里面一定只有一个元素,且就是表达式的值
所以问题就在于验证它为恒为零了。。这个思路挺无语的其实,就是找几个有代表性的值带进去算,所有计算值在误差范围内等于零即可判定为恒零
这几个代表性的值确实不能瞎写。。我自己写的时候试了好几次才试出来能过样例的,有的情况下出的测试点多了反而会导致误判,所以感觉这个题目在这里出的不好。。没太大意思
判断时所使用的精度可以高一点,我直接设置到了-9次方了,这个感觉高点更好
下面是我训练后写的代码
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#define LL long long
using namespace std;
const double pi=acos(-1);
const int Mod=1e9+7;
const double eps=1e-9;
int n;
stack<double>s;
string seq[300];
bool calcu(double a,string m[])
{
while(!s.empty())s.pop();
for(int i=0; i<n; i++)
{
string now=m[i];
if(now=="x")
s.push(a);
else if(now=="sin")
{
double tmp=s.top();
s.pop();
s.push(sin(tmp));
}
else if(now=="cos")
{
double tmp=s.top();
s.pop();
s.push(cos(tmp));
}
else if(now=="tan")
{
double tmp=s.top();
s.pop();
s.push(tan(tmp));
}
else if(now=="+")
{
double tmp1=s.top();
s.pop();
double tmp2=s.top();
s.pop();
s.push(tmp1+tmp2);
}
else if(now=="-")
{
double tmp1=s.top();
s.pop();
double tmp2=s.top();
s.pop();
s.push(tmp2-tmp1);
}
else
{
double tmp1=s.top();
s.pop();
double tmp2=s.top();
s.pop();
s.push(tmp1*tmp2);
}
}
double ans=s.top();
if(fabs(ans)<=eps)return true;
return false;
}
int main()
{
//freopen("out.txt","w",stdout);
while(cin>>n)
{
if(n==0)break;
for(int i=0; i<n; i++)
{
cin>>seq[i];
}
bool flag=true;
if(!calcu(0,seq)||!calcu(3.1415,seq)||!calcu(1.0,seq)||!calcu(-1234.5,seq)||!calcu(120,seq)||!calcu(-123.4,seq)||!calcu(9876,seq)
||!calcu(80,seq)||!calcu(acos(-1)/3.0,seq)||!calcu(-acos(-1)/3.0,seq)||!calcu(acos(-1),seq))
{
flag=false;
}
if(flag)cout<<"Identity"<<endl;
else cout<<"Not an identity"<<endl;
}
}