【C++】数値を差がkとなる2つの部分に分割するプログラムの作り方
はじめに
このチュートリアルでは、ある数値 n を「差が k」となる2つの部分に分割する C++ プログラムを紹介します。具体的には、n を2つの数 a と b に分け、a − b = k を満たす組み合わせを求める問題です。
入力例
n = 100 k = 30
出力例
65 35
解法の考え方(数学的なアプローチ)
この問題は、連立方程式を使うことで非常にシンプルに解くことができます。まず、次の2つの式を立てましょう。
- a + b = n(2つの部分の合計が n)
- a − b = k(2つの部分の差が k)
この2式を辺々加算すると、b の項が消えて以下の公式が得られます。
a = (n + k) / 2 b = n − a
つまり、n と k が分かれば、この公式に代入するだけで答えが一意に求まります。これ以上の複雑な処理は必要ありません。
C++での実装例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void divideTheNumber(int n, int k) {
double a = (n + k) / 2;
double b = n - a;
cout << a << " " << b << endl;
}
int main() {
int n = 54, k = 12;
divideTheNumber(n, k);
}実行結果
上記のコードをコンパイルして実行すると、以下の出力が得られます。
33 21
補足:整数と小数の扱いについて
(n + k) が奇数になる場合、a は小数となります。そのため、この実装では double 型を使用しています。結果を整数に限定したいケースでは、(n + k) が偶数であるかどうかを事前にチェックし、奇数の場合にエラーを返すなどの条件分岐を追加すると安全です。
まとめ
本記事では、連立方程式の考え方を応用して、数値を差が k となる2つの部分に分割する方法を解説しました。計算量は O(1) と非常に効率的で、大きな数に対しても即座に答えを求められます。チュートリアルの内容について質問がある場合は、コメント欄でお気軽にお知らせください。
-
C++で円を2つの部分に分割したときの角度差の最小値を求めるプログラム
この記事では、円を構成する各部分(扇形)の角度が格納された配列が与えられたとき、それらを連続的につなぎ合わせて2つの部分に分割した場合の角度差の最小値を求めるC++プログラムを解説します。問題の概要円全体(360度)を構成するすべての部分の角度が配列として与えられます。これらの部分を連続する範囲ごとに結合して2つのグループを作り、それぞれのグループの角度の合計の差が最小になるようにします。重要なのは、離れた位置にある部分(例えば最初の部分と3番目の部分など)を一緒にすることはできないという点です。入力例で理解しましょう入力ang[] = {90, 45, 90, 135}出力90説明1つ目と2
-
【C++入門】指定した範囲内のアームストロング数をすべて表示する方法
アームストロング数(Armstrong Number)とは、各桁の数字を「桁の総数」乗した値の合計が、元の数と等しくなるような数のことです。アームストロング数の例を以下に示します。3 = 3^1 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 407 = 4^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407 1634 = 1^4 + 6^4 + 3^4 + 4^4 = 1 + 1296 + 81 + 256 = 1634それでは、2つの範囲(区間)の間に存在するアームストロング数をすべて表示するプログラムを見ていきましょう。サンプルコー