当前位置: 首页 > news >正文

一元一次方程的解

1、题目描述

输入一个仅由整数、某个小写字母以及{'+','-','=' }三种数学符号组成的一元一次方程,方程中的小写字母代表未知数,并且:
(1)因为这是一元一次方程,所以只有一种字母会出现在方程中;
(2) 所有方程中出现的所有整数都小于100000。
(3)请注意,减号字符'-'也可以作为负号使用。
(4)请注意,当结果为0时应避免答案具有负号。形如x=-0.000的答案不可得分。
题目保证输入的所有一元一次方程均是一个合法的方程且有唯一实数解,例如下面3个一元一次方程都是合法的:

a+1=2
2x-4=x+8
-7+z=10086


输入描述
输入一行字符串,即题目所述的一元一次方程。字符串长度小于100。
输出描述
输出一个字母,字符'='和一个保留到小数点后三位的小数,表示一元一次方程的解。

样例输入:
a+1=2a-9
样例输出:
a=10.000

2、解题思路

我们可以将方程看作:

  • 左边表达式 = 右边表达式

  • 将未知数的系数移到等号左边,常数项移到等号右边

  • 最后解出 x = (常数和) / (系数和)

具体步骤

  1. 将方程按 = 拆成左右两部分。

  2. 分别解析左右表达式,统计未知数的系数和常数项。

  3. 解析时,遍历每个项(数字或字母或数字+字母),判断是系数还是常数。

  4. 移项后,左边系数 = 左边未知数系数 - 右边未知数系数,右边常数 = 右边常数 - 左边常数。

  5. 解 x = 常数 / 系数

方程表达式

我们可以用一个函数 parse 来处理一个表达式(如 "a+1"),返回 (系数, 常数)

解析时:

  • 用 + 或 - 分割项(注意保留符号)

  • 如果项中包含字母,则是未知数项,系数 = 该项去掉字母后的数值(如果只有字母,系数为 1 或 -1)

  • 如果不包含字母,则是常数项

边界情况

  • 开头可能是负号,如 -x+1=0

  • 系数为 1 或 -1 时省略数字

  • 整数可能为 0

  • 最终结果要避免 -0.000

3、时间复杂度

我们只需一次遍历解析两边表达式,所以是 O(n),n 为方程长度。

4、代码实现

import java.util.Scanner;public class Main {public static void main(String[] args) {//一元一次方程:将未知数的系数移到左边,常数项移到右边,通过x=(常数和)/(系数和)//分割方程式为左右//解析左右方程,获取系数和常数//移项//注意:避免-0.00Scanner in = new Scanner(System.in);String equation = in.nextLine();//找出未知数字母char variable = 'x';for (int i = 0; i < equation.length(); i++) {char ch = equation.charAt(i);if(ch>='a' && ch<='z'){variable = ch;break;}}//将方程式根据=分割成左右String[] sides = equation.split("=");String left = sides[0];String right = sides[1];//解析左右方程,获取系数和常数double[] leftRes = parseExpression(left,variable);double[] rightRes = parseExpression(right,variable);double coeL = leftRes[0];double conL = leftRes[1];double coeR =  rightRes[0];double conR = rightRes[1];//移项后, 左边系数 = 左边未知数系数 - 右边未知数系数,右边常数 = 右边常数 - 左边常数double coeTotal = coeL - coeR;double conTotal = conR - conL;double x = conTotal / coeTotal;//注意:避免-0.00if(Math.abs(x) < 1e-10){x = 0.0;}System.out.printf("%c=%.3f\n",variable, x);}//parseExpression()用于处理表达式,返回系数,常数//通过+ 或者 - 分割项(需要保留符号)//如果像中包含字母,就是未知项//不会包含字母就是常数项private static double[] parseExpression(String expr, char var) {double coefficient = 0.0; //系数double constant = 0.0;    //常数expr = "+" + expr; int i =0;while (i<expr.length()){int sign = 1;if(expr.charAt(i) == '+'){sign = 1;i++;} else if (expr.charAt(i) == '-') {sign = -1;i++;}//读取数字int j = i;while (j<expr.length() && (Character.isDigit(expr.charAt(j)) || expr.charAt(j) == '.')){j++;}String numStr = expr.substring(i,j);double num = 0.0;boolean hasDigit = !numStr.isEmpty();if(hasDigit){num = Double.parseDouble(numStr);}//检查变量if(j < expr.length() && expr.charAt(j) == var){if (!hasDigit){num = 1.0;}coefficient += sign * num;j++;}else {if (!hasDigit){num=0.0;}constant += sign * num;}i = j;}return new double[]{coefficient, constant};}
}

http://www.dtcms.com/a/469500.html

相关文章:

  • 自然语言处理中字节级与令牌级 Transformer 模型的对比分析
  • Android 编译速度优化:JVM堆内存扩充
  • 网站如何减少404跳转网站建设外包工作室
  • vue的hello小案例
  • SDL+WebGpu跨平台加速学习笔记
  • 第16章 C预处理器和C库
  • Vue-31-通过flask接口提供的数据使用plotly.js绘图(三)
  • vue前端面试题——记录一次面试当中遇到的题(5)
  • 90设计网站最便宜终身中小企业的网站建设
  • 杭州高端网站设计公司如何制作淘宝客网站
  • 微服务拆分以及注册中心
  • 遗留系统微服务改造(五):监控体系建设与指标收集
  • Java微服务面试实战:从电商场景看微服务架构设计与实现
  • (微服务)Dubbo 服务调用
  • Java微服务实战:从零搭建电商用户服务系统
  • Spring Cloud微服务SaaS智慧工地项目管理平台源码
  • MySQL常用API
  • DDD企业级记账软件实战二|从0-1创建用户微服务和记账微服务基于Spring Cloud
  • 昆明建设银行纪念币预约网站网站顶一下代码
  • 深入浅出 C# MVC:从基础实践到避坑指南(附完整代码示例)
  • 【网络】NAT相关知识;NAT的概念、工作机制、防火墙(Netfilter)的作用时间点;
  • JavaEE初级——Thread多线程
  • GJOI 10.9 题解
  • 如何设计一个架构良好的前端请求库?
  • 精灵图(雪碧图)的生成和使用
  • Web 开发 27
  • 网站制作主要公司学校网站开发系统的背景
  • Linux小课堂: 目录操作命令深度解析(LS 与 CD 命令)
  • 面向财经新闻的文本挖掘系统设计与实现(论文)
  • 【Redis-cli操作数据类型】Redis八大数据类型详解:从redis-cli操作到场景落地