一元一次方程式のプログラムを書いた.
4316 ワード
2日前、ある友达が私に1元1次方程式のプログラムを手伝ってほしいと言って、以下のように要求しました.
時間:1秒
メモリ:32 M
例:
2x-4+5x+300=98x
各方程式の一般的な形式は次のとおりです.
'='の両側はそれぞれxを変数とする式である
各式は'+'または'-'番号のアイテムで構成されます.
式には1元の'+'または'-'は表示されません.
各項目は、単独の整数であるか、または1つの整数と1つの小文字の文字xまたは1つの小文字の文字xから構成され、ここで、1つの小文字の文字xは1 xとして表される.
xの値を求めるプログラムを書いてください.与えられた方程式は、解がなくても無限解であってもよいことに注意してください.
データ入力
入力データには複数のテストデータが含まれていますので、EOF終了まで処理してください.
各入力データのセットは、260文字未満の行の文字列であり、与えられた1元1次方程式を表す.文字列には余分なスペースがなく、変数は小文字xです.xの係数は整数であり、整数の範囲は[0000]である.
データ出力
データ出力は与えられた方程式の解である.
Sが元の方程式の解である場合、Sの下向きの整数(すなわちs以下の最大の整数)を出力します.
元の方程式が解けていない場合は、「IMPOSIBLE」を出力します.
元の方程式に無限多解がある場合は「IDENTITY」を出力します.
サンプル入力
2x-4+5x+300=98x
x+2=2+x
サンプル出力
3
IDENTITY
私の考えは大体このようにして、最後に1元の1回の方程式をこのような形式に変えます:[coef]x=[cons]で、そのうちcoefはx前の係数で、consは定数で、このようにcons/coefで方程式の解を得ることができます.問題はxを合成する前の係数,定数である.
手順は次のとおりです.
時間:1秒
メモリ:32 M
例:
2x-4+5x+300=98x
各方程式の一般的な形式は次のとおりです.
'='の両側はそれぞれxを変数とする式である
各式は'+'または'-'番号のアイテムで構成されます.
式には1元の'+'または'-'は表示されません.
各項目は、単独の整数であるか、または1つの整数と1つの小文字の文字xまたは1つの小文字の文字xから構成され、ここで、1つの小文字の文字xは1 xとして表される.
xの値を求めるプログラムを書いてください.与えられた方程式は、解がなくても無限解であってもよいことに注意してください.
データ入力
入力データには複数のテストデータが含まれていますので、EOF終了まで処理してください.
各入力データのセットは、260文字未満の行の文字列であり、与えられた1元1次方程式を表す.文字列には余分なスペースがなく、変数は小文字xです.xの係数は整数であり、整数の範囲は[0000]である.
データ出力
データ出力は与えられた方程式の解である.
Sが元の方程式の解である場合、Sの下向きの整数(すなわちs以下の最大の整数)を出力します.
元の方程式が解けていない場合は、「IMPOSIBLE」を出力します.
元の方程式に無限多解がある場合は「IDENTITY」を出力します.
サンプル入力
2x-4+5x+300=98x
x+2=2+x
サンプル出力
3
IDENTITY
私の考えは大体このようにして、最後に1元の1回の方程式をこのような形式に変えます:[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();
}
}