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

【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) と非常に効率的で、大きな数に対しても即座に答えを求められます。チュートリアルの内容について質問がある場合は、コメント欄でお気軽にお知らせください。

  1. C++で円を2つの部分に分割したときの角度差の最小値を求めるプログラム

    この記事では、円を構成する各部分(扇形)の角度が格納された配列が与えられたとき、それらを連続的につなぎ合わせて2つの部分に分割した場合の角度差の最小値を求めるC++プログラムを解説します。問題の概要円全体(360度)を構成するすべての部分の角度が配列として与えられます。これらの部分を連続する範囲ごとに結合して2つのグループを作り、それぞれのグループの角度の合計の差が最小になるようにします。重要なのは、離れた位置にある部分(例えば最初の部分と3番目の部分など)を一緒にすることはできないという点です。入力例で理解しましょう入力ang[] = {90, 45, 90, 135}出力90説明1つ目と2

  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つの範囲(区間)の間に存在するアームストロング数をすべて表示するプログラムを見ていきましょう。サンプルコー