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

C++で指定した操作を用いて配列を単一の要素へ縮小する方法

整数変数 Number が入力として与えられます。ここでは、1 から Number までの範囲の要素が昇順に並んだ配列を考えます。この配列に対して「各ステップで奇数番目の位置にある要素を削除する」という操作を繰り返し、要素が 1 つだけ残るまで処理を行います。そして、最後に残ったその要素を出力することがゴールです。

注意: 要素の位置は、配列のインデックス 0 を「1 番目」、インデックス 1 を「2 番目」として数えるものとします。

配列の要素数ごとのテストケース

入力 Number=1 → 出力 = 1

入力 Number=2 → 出力 = 2

入力 Number=3 → 出力 = 2

入力 Number=4 → 出力 = 4

入力 Number=5 → 出力 = 4

入力 Number=6 → 出力 = 4

入力 Number=7 → 出力 = 4

……

入力 Number=12 → 出力 = 8

入力 Number=20 → 出力 = 16

上記の結果から、2i ~ 2i+1-1 の範囲の数値に対しては、出力が必ず 2i になるという規則性が見て取れます。

具体例

入力 − Number=7

出力 − 縮小操作後に残る単一の要素:4

説明 − 先頭の要素は 1 番目の位置にあり、以降も同様に数えます。

初期の配列は [ 1 2 3 4 5 6 7 ]

1 回目の操作後:[ 2 4 6 ]

2 回目の操作後:[ 4 ]

入力 − Number=18

出力 − 縮小操作後に残る単一の要素:16

説明 − 先頭の要素は 1 番目の位置にあり、以降も同様に数えます。

初期の配列は [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ]

1 回目の操作後:[ 2 4 6 8 10 12 14 16 18 ]

2 回目の操作後:[ 2 8 12 16 ]

3 回目の操作後:[ 8 16 ]

4 回目の操作後:[ 16 ]

プログラムで使用しているアプローチ

このアプローチでは、上記の規則性(公式)に基づいて while ループを使いながら最終結果を計算します。初期値を 2 とし、「result × 2 ≤ 入力値」が成立する間、各反復処理で値を 2 倍していきます。

  • 入力変数 Number を受け取ります。

  • 関数 getsingleElement(long num) が入力値を受け取り、上記の公式に基づいた結果を出力します。

  • 結果を格納する変数 result を用意します。

  • result を 2 で初期化します。

  • while ループで「result × 2 ≤ num」が満たされる間、処理を繰り返します。

  • ループ内で result を 2 倍にします。

  • ループが終了した時点で、目的の値が得られています。

  • result を返却します。

  • main 関数内で結果を出力します。

サンプルコード

#include<bits/stdc++.h>
using namespace std;
long getsingleElement(long num){
   long result;
   result=2;
   while(result*2 <= num){
      result=result*2;
   }
   return result;
}
int main(){
   int Number = 20;
   cout<<"The single element after reduction operation is : "<<getsingleElement(Number) ;
   return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

The single element after reduction operation is : 16
  1. C++で指定された差分を持つペアを見つける方法

    はじめに 配列 A に n 個の異なる要素が格納されているとします。この配列から、2つの要素 x と y の差が指定された値 d と一致するようなペア (x, y) をすべて見つける必要があります。 例として、配列が A = [10, 15, 26, 30, 40, 70]、指定された差分が 30 である場合を考えます。このとき、該当するペアは (10, 40) と (40, 70) です。 解法:ツーポインタ法 この問題は、配列が昇順にソートされていることを前提とすれば、ツーポインタ(二重インデックス)法を使って効率的に解くことができます。まず、1つ目のポインタ「i」を先頭の要素に、2つ目の

  2. C++で絶対差の合計が最小となる配列要素を求める方法

    このプログラムは、重複しない要素からなる配列が与えられたときに、各要素の絶対差の合計が最小となる値を求めるものです。この概念をより深く理解するために、まず必要な基礎知識をおさらいしましょう。配列(Array)とは、同じデータ型の要素を格納するためのコンテナです。配列の長さは事前に定義しておく必要があります。絶対差(Absolute Difference)とは、2つの数値の差の絶対値のことです。つまり、差は常に正の値となり、負の値は正の値に変換されます。各要素について最小絶対差を求め、その合計を計算します。最小絶対差の公式は次のとおりです。Minimum Absolute Difference