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

早两天,有一个朋友要我帮忙做一个一元一次方程的程序,要求如下:

时限: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();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值