Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

다항식 미분을 자동으로 계산하는 C++ 프로그램 구현하기


다항식 항들이 담긴 문자열이 주어졌을 때, 해당 다항식의 도함수(미분값)를 계산하는 것이 이번 글의 목표입니다.

다항식이란?

다항식(Polynomial)은 '많은'을 뜻하는 Poly와 '항'을 의미하는 nomial의 합성어로, 말 그대로 여러 개의 항으로 이루어진 식입니다. 다항식은 변수, 계수, 지수를 포함하며, 변수에 대한 덧셈·뺄셈·곱셈 연산만으로 구성됩니다.

다항식 예시: x2 + x + 1

다항식의 미분 공식

p(x) = mxn 형태의 항을 미분하면 결과는 다음과 같습니다.

m * n * x^(n-1)

예제

입력: str = "2x^3 + 1x^1 + 3x^2"
      val = 2
출력: 37
설명: 6x^2 + 1x^0 + 6x^1
      x = 2 대입 시
      6*4 + 1 + 6*2 = 24 + 1 + 12 = 37

입력: str = "1x^3"
      val = 2
출력: 12
설명: 1 * 3 * x^2
      x = 2 대입 시
      3 * 4 = 12

문제 해결 접근 방법

  • 다항식 문자열과 x의 값을 입력받습니다.
  • 문자열을 한 글자씩 순회하면서 숫자(계수)와 변수를 구분합니다.
  • '+' 기호를 만날 때까지 각 항을 하나씩 읽어가며 처리합니다.
  • 각 항에 대해 미분 법칙인 m * n * x^(n-1)을 적용합니다.
  • 모든 항의 미분값을 합산한 최종 결과를 반환합니다.

알고리즘

시작
1단계 -> 함수 long long term(string polyterm, long long val)
    문자열 coeffStr을 ""로 선언 및 초기화
    정수형 i 선언
    반복문: i = 0부터 polyterm[i]가 'x'가 아닐 때까지 i++
        coeffStr.push_back(polyterm[i]) 호출
        coeff = atol(coeffStr.c_str()) 설정
    문자열 powStr을 ""로 선언 및 초기화
    반복문: i = i + 2부터 i가 polyterm.size()가 아닐 때까지 i++
        powStr.push_back(polyterm[i]) 수행
        power = atol(powStr.c_str()) 설정
    coeff * power * pow(val, power - 1) 반환

2단계 -> 함수 long long value(string& str, int val)
    ans = 0으로 설정
    istringstream is(str) 생성
    문자열 polyterm 선언
    while (is >> polyterm) 동안 반복
        토큰이 "+"이면 계속 진행(continue)
        아니면 ans = (ans + term(polyterm, val)) 누적
    ans 반환

3단계 -> main() 함수
    str = "2x^3 + 1x^1 + 3x^2"로 선언 및 초기화
    val = 2로 선언 및 초기화
    value(str, val)의 반환값 출력
종료

C++ 코드 구현

#include <bits/stdc++.h>
using namespace std;

// 각 항의 미분값을 계산하는 함수
long long term(string polyterm, long long val) {
    // 계수(coefficient) 추출
    string coeffStr = "";
    int i;
    for (i = 0; polyterm[i] != 'x'; i++)
        coeffStr.push_back(polyterm[i]);
    long long coeff = atol(coeffStr.c_str());

    // 지수(power) 추출
    string powStr = "";
    for (i = i + 2; i != polyterm.size(); i++)
        powStr.push_back(polyterm[i]);
    long long power = atol(powStr.c_str());

    // ax^n 형태의 항에 대해 a(n-1)x^(n-1) 값 반환
    return coeff * power * pow(val, power - 1);
}

// 전체 다항식의 미분값을 계산하는 함수
long long value(string& str, int val) {
    long long ans = 0;
    // istringstream을 사용해 문자열을 토큰 단위로 입력받음
    istringstream is(str);
    string polyterm;
    while (is >> polyterm) {
        // 토큰이 '+'이면 건너뛰고 다음 토큰 처리
        if (polyterm == "+")
            continue;
        // 그렇지 않으면 해당 항의 미분값을 더함
        else
            ans = (ans + term(polyterm, val));
    }
    return ans;
}

// 메인 함수
int main() {
    string str = "2x^3 + 1x^1 + 3x^2";
    int val = 2;
    cout << value(str, val);
    return 0;
}

실행 결과

37

위 코드는 istringstream을 활용해 다항식 문자열을 공백 단위의 토큰으로 분리한 뒤, '+' 기호는 건너뛰고 각 항마다 계수와 지수를 추출하여 미분 법칙을 적용합니다. 이후 주어진 x 값에 미분된 식을 대입해 최종 결과를 계산합니다. 문자열 파싱과 수학적 규칙을 결합한 이 방식은 다항식 미분 문제를 매우 직관적이고 효율적으로 해결할 수 있게 해줍니다.