문제
다항함수(polynomial)는 항(term)들의 합이며, 항(term)은 계수(coefcient) 와 지수(exponent)에 의해서 정의된다. 계수는 0이 아닌 정수이고 지수는 음이 아닌 정수라고 가정한다. 예를 들면, f(x) = -x5 + 2x4 -10x - 3
$ create f // 다항함수 f = 0을 정의한다.
$ add f 2 3 // f(x)에 2x3을 더한다. 따라서 f(x) = 2x3 이 된다.
$ add f -1 1 // f(x) = 2x3 - x 이 된다.
$ add f 5 0 // f(x) = 2x3 - x + 5 이 된다.
$ add f 2 1 // f(x) = 2x3 - x + 5 + 2x = 2x3 + x + 5 이 된다.
$ calc f 2 // x=2일 때 다항함수 f의 값, 즉 f(2) = 23을 계산하여 출력한다.
23
$ print f // 차수에 관한 내림차순으로 정렬하여 다음과 같이 출력한다.
2x^3 + x + 5 // 동일한 차수의 항은 하나로 합쳐져야 한다.
$ create g // 다른 다항 함수 g를 정의한다.
….
$ exit
입력
출력
코드
public class Term {
public int coef;
public int expo;
}
//class Term은 다항식을 구성하는 하나의 항을 표현하기 위한 클래스이다. 계수 (coef)와 차수(expo)를 가진다
public class Polynomial {
public char name; //다항식의 이름
public int nTerms = 0; // 항의 개수 == 배열의 개수
public Term [] terms; //다항식을 구성하는 항들을 저장할 배열
}
public class Code06 {
static Polynomial [] polys = new Polynomial [100];
static int n = 0;
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
while(true) {
System.out.println("$ ");
String command = kb.next();
if(command.equals("create")){
char name = kb.next().charAt(0);
Polynomial p = new Polynomial();
p.name = name;
p.nTerms = 0;
polys[n] = p;
polys[n].terms = new Term[100];
n++;
}
else if(command.equals("add")) { //add f 2 3
char name = kb.next().charAt(0);
int index = find(name);
if (index == -1) {
System.out.println("No such polynomial exists");
}
else {
int c = kb.nextInt();
int e = kb.nextInt();
addTerm(polys[index], c, e);
}
}
else if(command.equals("calc")) {
char name = kb.next().charAt(0);
int index = find(name);
if (index == -1) {
System.out.println("No such polynomial exists");
}
else {
int x = kb.nextInt();
int result = calcPolynomial(polys[index], x);
System.out.println(result);
}
}
else if(command.equals("print")) {
char name = kb.next().charAt(0);
int index = find(name);
if (index == -1) {
System.out.println("No such polynomial exists");
}
else {
printPolynomial(polys[index]);
}
}
else if(command.equals("exit")) {
break;
}
}
kb.close();
}
private static int calcPolynomial(Polynomial p, int x) {
int result = 0;
for (int i = 0; i < p.nTerms; i++)
result += calcTerm(p.terms[i], x);
return result;
}
private static int calcTerm(Term term, int x) {
return (int)(term.coef * Math.pow(x, term.expo));
}
private static void printPolynomial(Polynomial p) {
for (int i =0; i<p.nTerms; i++) {
printTerm(p.terms[i]);
System.out.println("+");
}
System.out.println();
}
private static void printTerm(Term term) {
System.out.println(term.coef + "x^" + term.expo);
}
private static void addTerm(Polynomial p, int c, int e) {
int index = findTerm(p,e);
if(index != -1) {
p.terms[index].coef += c; //
}
else {
int i = p.nTerms - 1;
while(i >= 0 && p.terms[i].expo < e) {
p.terms[i+1] = p.terms[i];
i--;
}
p.terms[i+1]= new Term();
p.terms[i+1].coef = c;
p.terms[i+1].expo = e;
p.nTerms++;
}
}
private static int findTerm(Polynomial p, int e) {
for (int i = 0; i < p.nTerms && p.terms[i].expo >= e; i++)
if(p.terms[i].expo == e)
return i;
return -1;
}
private static int find(char name) {
for (int i=0;i<n;i++) {
if(polys[i].name == name)
return i;
}
return -1;
}
}
'Computer Science > 자바' 카테고리의 다른 글
[JAVA] 객체 생성 및 사용법 (0) | 2023.03.23 |
---|---|
[JAVA] 클래스 소스파일 작성 유의점 (0) | 2023.03.23 |
[Java] 객체지향개념(요약) (0) | 2023.03.17 |
[JAVA] 사각형의 면적 구하기 (0) | 2023.02.10 |
[JAVA] 클래스, 객체, 참조변수, 객체배열_JAVA (0) | 2023.02.08 |