UVa1661/LA4047 Equation

ops/2024/10/18 7:54:18/

UVa1661/LA4047 Equation

  • 题目链接
  • 题意
  • 分析
  • AC 代码

题目链接

  本题是2007年icpc欧洲区域赛东北欧赛区的题目

题意

  输入一个后缀表达式f(x),解方程f(x)=0。表达式包含四则运算符,且x最多出现一次,表达式的字符数不超过30。保证不会出现除以常数0的情况,即至少存在一个x,使得f(x)不会除0。所谓后缀表达式,是指把运算符写在运算数的后面。例如,(4x+2)/2的后缀表达式为4x * 2 + 2 /。样例输入与输出如下表所示。

样例输入样例输出
4 X * 2 + 2 /X = -1/2
2 2 *NONE
0 2 X / *MULTIPLE

分析

  本题需要把后缀表达式转化成表达式树然后反复进行等式变换最后解出方程,输出是分数形式,要注意30个字符内的后缀表达式在计算中分子分母可能超出32位整数,因此要用64位整数。题目说“保证不会出现除以常数0的情况,即至少存在一个x,使得f(x)不会除0”说明在不含x的常数表达式运算中不会出现除以0(可以不进行运算合法性检验),但是含x的等式( 0 × f ( x ) = p / q , f ( x ) × 0 = p / q , 0 ÷ f ( x ) = p / q 0\times f(x)=p/q,\;f(x)\times 0=p/q,\;0\div f(x)=p/q 0×f(x)=p/q,f(x)×0=p/q,0÷f(x)=p/q)就需要检验了: p ≠ 0 p\ne 0 p=0时无解, p = 0 p=0 p=0时有多解。

AC 代码

#include <iostream>
#include <algorithm>
using namespace std;#define N 32
struct frac {long long p, q;void calc(char op, const frac& x) {if (op == '+') p = p*x.q + x.p*q, q *= x.q;else if (op == '-') p = p*x.q - x.p*q, q *= x.q;else if (op == '*') q *= x.q, p *= x.p;else q *= x.p, p *= x.q;}void print() const {long long g = abs(__gcd(p, q));if (q < 0) g = -g;cout << "X = " << p/g << '/' << q/g << endl;}
};
int s[N], l[N], r[N], n; char op[N];bool has_x(int i) {if (op[i] == 'X') return true;if (op[i] < '0') return has_x(l[i]) || has_x(r[i]);return false;
}frac calc(int i) {if (op[i] >='0' && op[i] <= '9') return {op[i]-'0', 1};frac x = calc(l[i]); x.calc(op[i], calc(r[i]));return x;
}void solve(int i, frac& c) {if (i < 0) return;if (op[i] == 'X') return c.print();if (op[i] >= '0') cout << (c.p != (op[i]-'0') * c.q ? "NONE" : "MULTIPLE") << endl;else if (has_x(l[i])) {frac f = calc(r[i]);if (f.p == 0 && (op[i] == '*' || op[i] == '/')) cout << (c.p ? "NONE" : "MULTIPLE") << endl;else c.calc(op[i] == '*' ? '/' : (op[i] == '/' ? '*' : (op[i] == '+' ? '-' : '+')), f), solve(l[i], c);} else if (has_x(r[i])) {frac f = calc(l[i]);if (f.p == 0 && (op[i] == '*' || op[i] == '/')) cout << (c.p ? "NONE" : "MULTIPLE") << endl;else if (op[i] == '/' && c.p == 0) cout << "NONE" << endl;else if (op[i] == '-' || op[i] == '/') f.calc(op[i], c), solve(r[i], f);else c.calc(op[i] == '*' ? '/' : '-', f), solve(r[i], c);} else {frac f = calc(i); cout << (f.p * c.q != c.p * f.q ? "NONE" : "MULTIPLE") << endl;}
}void solve() {int t = n = 0, k; frac c{0, 1};if (cin.peek() == '\n') cin.get();while ((k = cin.peek()) != '\n' && k != EOF) if (k != ' ') {cin >> op[n++];if (k >= '0') s[t++] = n-1;else r[n-1] = s[--t], l[n-1] = s[t-1], s[t-1] = n-1;} else cin.get();solve(n-1, c);
}int main() {while (cin.peek() != EOF) solve();return 0;
}

http://www.ppmy.cn/ops/94381.html

相关文章

injected stylesheet 导致 页面重置按钮文字样式改变,按钮中的文字看不清晰

项目场景&#xff1a; 相关背景&#xff1a; injected stylesheet 导致 页面重置按钮文字样式改变&#xff0c;看不清晰 问题描述 遇到的问题&#xff1a; 检查页面中该按钮的代码如下所示&#xff1a; <div class"el-form-item__content"> <button d…

基于ssm+vue+uniapp的英语学习交流平台小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

Oracle ACE是什么缩写?

大家都知道&#xff0c;Oracle有个ACE 计划&#xff0c;旨在奖励和表彰个人对 Oracle 社区做出的贡献。 这些贡献主要包括两方面&#xff1a; 知识与经验分享&#xff0c;如撰写博客、书籍和文章&#xff1b;制作视频教程&#xff1b;为开源项目做贡献&#xff1b;编写代码&a…

Vue自我总结面试

1.vue-router中有哪些模式&#xff1f;有什么区别&#xff1f; Vue Router 提供了三种路由模式&#xff1a;‌Hash 模式、‌History 模式和 Abstract 模式。‌ Hash 模式&#xff08;默认&#xff09;&#xff1a; URL中带有 # &#xff0c;兼容较老的浏览器。例如&#xff…

Springboot整合Flowable入门-学习笔记

目录 1、定义流程&#xff08;画图&#xff09; 2、Springboot部署流程 3、Springboot删除所有流程 4、Springboot根据 流程部署ID 查询 流程定义ID 5、Springboot启动(发起)流程 6、Springboot查询任务 6.1全部任务 6.2我的任务&#xff08;代办任务&#xff09; 7、…

【自用】Python爬虫学习(三):图片下载、使用代理、防盗链视频下载、多线程与多进程

Python爬虫学习&#xff08;三&#xff09; 使用BeautifulSoup解析网页并下载图片模拟用户登录处理使用代理视频下载&#xff0c;防盗链的处理多线程与多进程 使用BeautifulSoup解析网页并下载图片 目的&#xff1a;对某网站的某个专栏页面的图片进行下载得到高清图。 思路&am…

搜索-LETTERS

LETTERS 更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0205/156/ 给出一个roe*col的大写字母矩阵&#xff0c;一开始的位置为左上角&#xff0c;你可以向上下左右四个方向移动&#xff0c;并且不能移向曾经经过的字母。问最多可以经过几个字母 输入&#…

Java毕业设计 基于SSM和Vue的酒店管理系统小程序

Java毕业设计 基于SSM和Vue的酒店管理系统小程序 这篇博文将介绍一个基于SSM框架和Vue开发的酒店管理系统微信小程序&#xff0c;适合用于Java毕业设计。 功能介绍 用户 登录 注册 忘记密码 首页 图片轮播 房间信息 房间详情 预订 收藏 评论 我的 订单信息 酒店管理…