C++で混合液を目標の濃度にするために必要な水の追加量を求める方法
問題の概要
容量 X の容器に、水と別の液体が混ざった混合液が入っているとします。この混合液に含まれる水の割合は W% です。ここで、水を追加して水の割合を Y% まで引き上げたい場合、何リットルの水を加えればよいのでしょうか?
例えば、X = 125、W = 20、Y = 25 という条件の場合、必要な水の量は 8.33 リットルとなります。
計算式の導出
元の混合液に A リットルの水を加えると、混合液の総量は X + A になります。このとき、混合液中の水の総量は次の式で表せます。
(元の水の量) + A = (X の W%) + A
一方、新しい混合液における水の割合は Y% なので、水の量は (X + A) の Y% と一致します。したがって、次の等式が成り立ちます。
(X + A) の Y% = (X の W%) + A
この式を A について解くことで、以下の公式が得られます。
A = [X × (Y − W)] ÷ (100 − Y)
公式の検証
例の数値を当てはめてみましょう。X = 125、W = 20、Y = 25 の場合、
A = 125 × (25 − 20) ÷ (100 − 25) = 625 ÷ 75 ≒ 8.33
となり、約 8.33 リットルの水を追加すれば水の割合が 25% になることが確認できます。
C++での実装例
#include<iostream>
using namespace std;
float getWaterAmount(float X, float W, float Y) {
return (X * (Y - W)) / (100 - Y);
}
int main() {
float X = 125, W = 20, Y = 25;
cout << "必要な水の量は " << getWaterAmount(X, W, Y) << " リットルです";
return 0;
}実行結果
必要な水の量は 8.33333 リットルです
まとめ
この問題は、追加後の水の量を2通りの方法(「元の水の量+追加量」と「新しい総量のY%」)で表し、等式を立てて A について解くことで解決できます。導出した公式 A = X × (Y − W) ÷ (100 − Y) を使えば、容器の容量と現在・目標の濃度が分かっている任意のケースにすぐに適用できます。計算量は O(1) と非常に効率的です。
-
C++で二分木内の指定キーの次の右ノードを検索する方法
問題概要この問題では、二分木(Binary Tree)とキー値が与えられます。目的は、指定されたキーを持つノードの次の右ノードを見つけることです。二分木とは、各ノードが最大2つの子ノード(左の子と右の子)を持つ特殊なデータ構造で、データの格納や効率的な探索に広く活用されています。具体例で理解しよう入力key = 4出力5説明ノード4と同じレベルに位置し、その右隣にある要素は5です。したがって、答えは5となります。解決アプローチこの問題に対するシンプルな解決策は、幅優先探索(レベル順走査)を用いて二分木を走査することです。具体的には、以下の手順で処理を行います。キューを使用してレベル順にノードを
-
【C++】二分木で特定のノードのミラー(鏡像)を検索する方法
この問題では、二分木(バイナリツリー)が与えられ、指定されたノードの「ミラー(鏡像)」となるノードを木の中から探します。ここでいうミラーとは、反対側の部分木にある対称の位置に相当するノードのことです。木を中心線で折り返したときに重なり合う位置関係をイメージすると分かりやすいでしょう。 問題例 入力 出力 B のミラーは E 解き方のアプローチ 最もシンプルな解法は、根(ルート)から再帰的に探索を行う方法です。左部分木と右部分木を指す2つのポインタを用意し、両側を同時にたどっていきます。片方のノードが目的の値と一致した時点で、対になる反対側のノードの値を返します。見つからない場合は、さらに深