Gym100015 I Identity Checker 栈容器使用,数学

该博客讲述了如何使用C++栈来处理一个三角表达式,检查其是否恒为零。博主在复盘过程中发现,正确处理表达式后,栈内仅剩一个元素即为表达式的值。通过选取特定数值进行计算并比较是否接近于零来判断,但选择这些数值需要谨慎,过高或过少的测试点可能导致误判。博主强调了判断时的精度设定,并分享了训练后的代码。
摘要由CSDN通过智能技术生成

给出一个三角表达式,问是否恒为零

训练的时候队友写了,后来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;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值