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

【C++】n枚のコインを階段状に並べたときの完全な段数を求める方法

n枚のコインを階段状に並べることを考えてみましょう。ここでは、k段目には必ずちょうどk個のコインが置かれるというルールがあります。つまり、与えられたn枚のコインから、何段の「完全な階段」を作ることができるかを求めるのがこの問題です。

例えば、入力が5の場合、出力は2になります。5枚のコインで2段目までの完全な階段を作ることができますが、3段目には3枚のコインが必要なところ、残りは2枚しかないためです。図で表すと次のようになります。

*
**
**

公式による解法

この問題は、1段目からk段目までのコインの総数が 1 + 2 + … + k = k(k+1)/2 となることを利用すると、次の公式によって直接計算することができます。

$$\frac{\sqrt{(8n+1)}-1}{2}$$

この式は、「k(k+1)/2 ≤ n」を満たす最大の整数kを求める二次方程式を解くことで導出できます。ループで1段ずつ数える方法よりも計算量が少なく、大きなnに対しても高速に処理できるのが利点です。

C++での実装例

それでは、実際のコードを見て理解を深めましょう。

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int arrangeCoins(int n) {
      return (sqrt(8*(long long)n+1)-1)/2;
   }
};
main(){
   Solution ob;
   cout << (ob.arrangeCoins(13));
}

なお、8倍する際にint型のオーバーフローを防ぐため、(long long) にキャストしている点に注目してください。

入力

13

出力

4

この出力は、1 + 2 + 3 + 4 = 10 枚で4段目まで完成しますが、5段目を完成させるには合計15枚が必要であり、13枚では足りないためです。公式に当てはめても (√105 − 1) / 2 ≒ 4.65 となり、小数点以下を切り捨てた4という同じ結果が得られます。

  1. C++の識別子とは?命名ルールと具体例をわかりやすく解説

    C++における識別子(identifier)とは、変数、関数、クラス、モジュールなど、プログラマが定義するさまざまな要素に名前を付けて識別するために使われる名称です。識別子の命名には以下のルールがあります。先頭は半角アルファベットの大文字(A〜Z)、小文字(a〜z)、またはアンダースコア(_)で始める必要があります。2文字目以降は、英字・数字(0〜9)・アンダースコアを自由に組み合わせられます。識別子の中に「@」「$」「%」などの記号(句読点・特殊文字)を使うことはできません。大文字と小文字は区別されるC++は大文字と小文字を厳密に区別するプログラミング言語です。そのため、「Manpower」

  2. Linux向けC++開発に最適なIDEのおすすめ6選

    大規模なプロジェクトをテキストエディタだけで管理するのは容易ではありません。そうしたケースではIDE(統合開発環境)を活用することで、生産性が向上し、フラストレーションも大幅に軽減されるでしょう。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。「Linux上のC++開発において唯一のベスト」と呼べるIDEは存在せず、賢くツールを見極める必要があります。ここでは、人気が高く、編集部のおすすめでもあるLinux向けIDEを紹介します。Linuxで使えるC++向けIDE おすすめ6選1. NetBeansNetBeansは、C/C++をはじめ多くのプログラミング言語に対