C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で多項式の導関数を求めるプログラムの実装方法

多項式の各項を含む文字列が与えられたとき、その多項式の導関数を計算するのが本記事の課題です。

多項式とは?

「多項式(Polynomial)」という言葉は、「多く」を意味する「Poly」と「項」を意味する「nomial」という2つの言葉から成り立っており、文字どおり「多くの項」で構成される式を指します。多項式とは、変数・係数・指数を含み、変数の加算・減算・乗算といった演算のみを用いて表された式のことです。

多項式の例:

x^2 + x + 1

多項式 p(x) = mx^n の導関数は、以下のようになります。

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 を宣言
    ループ: is >> polyterm で読み取れている間
        polyterm == "+" の場合
            処理を継続する
        それ以外の場合
            ans = (ans + term(polyterm, val)) を設定
    ans を返す
ステップ3 -> 関数 int 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) {
    // 係数を求める
    string coeffStr = "";
    int i;
    for (i = 0; polyterm[i] != 'x'; i++)
        coeffStr.push_back(polyterm[i]);
    long long coeff = atol(coeffStr.c_str());
    // 指数の値を取得する
    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;
}
// main 関数
int main() {
    string str = "2x^3 + 1x^1 + 3x^2";
    int val = 2;
    cout << value(str, val);
    return 0;
}

出力結果

37

このプログラムでは、まず istringstream を使って多項式の文字列を項ごとに分割し、「+」記号をスキップしながら各項を順に処理します。各項では、係数と指数を文字列から数値へ変換した後、微分公式 m * n * x^(n-1) に基づいて x の値を代入した結果を計算し、すべての項の合計を導関数の値として出力します。

  1. C++で十二面体の表面積を計算するプログラム

    十二面体とは? 「十二面体(dodecahedron)」という言葉は、ギリシャ語に由来しています。「dodeca」は「12」、「hedron」は「面」を意味します。幾何学における十二面体とは、12枚の平面から構成される3次元の正多面体(プラトンの立体)のことです。 他の立体図形と同様に、十二面体にも以下のような特徴的な性質があります。 20個の頂点 30本の辺 12枚の正五角形の面(五角形は5つの辺を持つ多角形) 以下は十二面体の図です。 問題 一辺の長さが与えられたとき、その十二面体の表面積を求めるプログラムを作成します。ここでいう表面積とは、図形のすべての面が占める空間の総面積のこ

  2. C++で学ぶクイックソート(QuickSort)の仕組みと実装方法

    クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率