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 の値を代入した結果を計算し、すべての項の合計を導関数の値として出力します。
-
C++で十二面体の表面積を計算するプログラム
十二面体とは? 「十二面体(dodecahedron)」という言葉は、ギリシャ語に由来しています。「dodeca」は「12」、「hedron」は「面」を意味します。幾何学における十二面体とは、12枚の平面から構成される3次元の正多面体(プラトンの立体)のことです。 他の立体図形と同様に、十二面体にも以下のような特徴的な性質があります。 20個の頂点 30本の辺 12枚の正五角形の面(五角形は5つの辺を持つ多角形) 以下は十二面体の図です。 問題 一辺の長さが与えられたとき、その十二面体の表面積を求めるプログラムを作成します。ここでいう表面積とは、図形のすべての面が占める空間の総面積のこ
-
C++で学ぶクイックソート(QuickSort)の仕組みと実装方法
クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率