欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

写了一个一元一次方程的程序

程序员文章站 2022-05-09 13:47:36
...
早两天,有一个朋友要我帮忙做一个一元一次方程的程序,要求如下:

时限:1秒
内存:32M

比如:
2x-4+5x+300=98x
每一个方程的一般形式是这样的:
'='两边分别为以x为变量的表达式
每个表达式都是由'+'或'-'号的项组成
表达式中不会出现一元的'+'或'-'
每一个项,或都是一个单独的整数,或都是由一个整数和一个小写的字符x或由一个小写的字符x组成,这里,一个小写的字符x表示为1x
请你写一个程序求得x的值。要注意的是,给出的方程可以没有解或都有无穷解。

数据输入
输入数据包括多组测试数据,请处理到EOF结束。

每组输入数据为一行长度小于260个字符的字符串,表示给出的一元一次方程。字符串里没有多余的空格,并且变量都为小写字符x。x的系数为一个整数,整数的范围为[0,1000]。

数据输出
数据输出为给出的方程的解。

如果S是原方程的解,请输出S的向下取整后的整数(即小于或等于s的最大的整数)。
如果原方程没有解,请输出"IMPOSSIBLE"。
如果原方程有无穷多解,请输出"IDENTITY"。
样例输入
2x-4+5x+300=98x
x+2=2+x
样例输出
3
IDENTITY

我的思路大概是这样的,最后是要把一元一次方程变成这样的形式:[coef]x=[cons],其中coef为x前的系数,cons为常数,这样再用cons/coef就可以得出方程的解。所以问题就是合并x前的系数,常数。
程序如下:


package org.fsj.lib;

import java.util.List;
import java.util.ArrayList;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
* Author: fsj
* Date: 2008-5-12
* Time: 1:29:46
*/
public class Equation {

//输入的方程列表
private List equationList = new ArrayList();

public void input() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
try {
while ((str = br.readLine()) != null) {
equationList.add(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}

public void compute() {
for (String equation : equationList) {
computeEquation(equation);
}
}

public void computeEquation(String equation) {
int coefficient = 0; //系数
int constant = 0; //常数
int coefficientSymbol = 1; //系数的符号,=号左边为正
int constantSymbol = -1; //常数的符号号,=号左边为负
int item = 0; //方程的数字项
int symbol = 1; //系数和常数前的正负号
int i = 0;
boolean zero = true;
char ch;
char[] charItem = new char[260];

for (int index = 0; index < equation.length(); index++) {
ch = equation.charAt(index);
item = 0;

//循环取出数字项
while (ch >= '0' && '9' >= ch) {
item = item * 10 + ch - '0';
if (item == 0) zero = false;
if (++index < equation.length()) {
ch = equation.charAt(index);
} else {
break;
}
}
charItem[i++] = ch;
if (i > 1) {
//取出系数或者是常数前的正负号
symbol = (charItem[i - 2] == '-' ? -1 : 1);
}
//如果是x,累加x前的系数到coefficient
if (ch == 'x') {
if (item == 0 && zero) item = 1;
coefficient = coefficient + item * coefficientSymbol * symbol;
} else {
//否则累加常数到constant
constant = constant + item * constantSymbol * symbol;
//如果当前的字符为=,系数前的符号变成负,常数前的符号变成正
if (ch == '=') {
coefficientSymbol = -1;
constantSymbol = 1;
}
}
}

//输出:系数不为0,输出解;否则系数为0,常数也为0,输出无穷解,否则输出无解
if (coefficient != 0) {
System.out.println((int) Math.floor((float) constant / coefficient));
} else {
if (constant == 0) {
System.out.println("IDENTITY");
} else {
System.out.println("IMPOSSIBLE");
}
}

}


public static void main(String[] args) {
Equation eq = new Equation();
eq.input();
eq.compute();
}
}