다항함수
다항함수는 항들의 합이며, 항은 계수와 지수에 의해서 정의된다. 계수는 0이 아닌 정수이고
지수는 음이 아닌 정수라고 가정한다.
프로그램 실행 예
$ create f // f=0을 정의한다.
$ add f 2 3 // f(x)에 2x3승 을 더한다. 따라서 f(x) = 2x3이 된다.
$ add f -1 1 // f(x) = 2x3 -x
$ calc f 2 // x=2일때 f의 값을 출력한다.
$ print f // 차수에 관한 내림차순으로 정렬하여 출력한다.
$ create g // 다른 다항함수 g를 정의한다.
$ exit //종료
처음에는 어떤 자료구조를 만들어
다항함수를 표현할것인가??
항 들이 모여서 다항함수를 만든다!
package section1;
public class Term {
public int coef;//계수
public int exp;//차수
}
계수와 차수를 가지는 항 클래스 생성
package section1;
public class Polynomial {
public char name; //다항식의 이름
public int nTerms; // 항의 개수
public Term[] terms; //항들의 배열
}
다항 클래스 생성
package section1;
import java.util.Scanner;
public class code6 {
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.print("$ ");
String command = kb.next();
if(command.equals("create")) {
char name = kb.next().charAt(0);
polys[n] = new Polynomial();
polys[n].terms = new Term[100];
polys[n].name = name;
polys[n].nTerms = 0;
n++;
}
else if(command.equals("add")) {
char name = kb.next().charAt(0);
int index = find(name);
if(index==-1) {
System.out.println("No such Polynomial exist");
}
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 exist");
}
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 exist");
}
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 += calTerm(p.terms[i], x);
}
return result;
}
private static int calTerm(Term term, int x) {
return (int)(term.coef * Math.pow(x, term.exp));
}
private static void printPolynomial(Polynomial p) {
for(int i =0; i<p.nTerms; i++) {
printTerm(p.terms[i]);
System.out.print("+");
}
System.out.println();
}
private static void printTerm(Term term) {
System.out.print(term.coef + "x^" +term.exp);
}
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].exp < 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].exp =e;
p.nTerms++;
}
}
private static int findTerm(Polynomial p, int e) {
for(int i=0;i<p.nTerms && p.terms[i].exp >=e ;i++) {
if(p.terms[i].exp ==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;
}
}

디테일한 완성도가 떨어지는 코드라서 몇 가지 수정해야할 부분을 수정할 예정이다.
'알고리즘 with 자바 > 자료구조' 카테고리의 다른 글
| 메서드와 생성자 2 (0) | 2021.06.24 |
|---|---|
| 메서드와 생성자 1 (0) | 2021.06.23 |
| 클래스, 객체, 참조변수 4 (0) | 2021.06.22 |
| 클래스, 객체, 참조변수 3 (0) | 2021.06.22 |
| 클래스, 객체, 참조변수 2 (0) | 2021.06.21 |