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

【C++】N以下の数のうち平方数かつ立方数であるものを数える方法

整数 N が与えられたとき、N 以下の数の中に「平方数(ある整数の2乗)」であり、かつ「立方数(ある整数の3乗)」でもある数がいくつ存在するかを求めるのが本記事のテーマです。たとえば、1 と 64 はどちらも平方数であると同時に立方数でもあります。

判定には、平方根を計算する sqrt() と、三乗根を計算する cbrt() を利用します。まずは具体例で確認しましょう。

入出力の例

入力:N = 100

出力:平方数かつ立方数である数の個数 ― 2

説明:1 から 100 の範囲で、平方数かつ立方数でもあるのは 1 と 64 のみです。

入力:N = 5000

出力:平方数かつ立方数である数の個数 ― 4

説明:1 から 5000 の範囲では、1、64、729、4096 が該当します。

プログラムのアプローチ

  • 整数 N を入力として受け取ります。
  • 関数 getCount(int n) は N を引数にとり、N 以下の数のうち平方数かつ立方数であるものの個数を返します。
  • カウンタの初期値を 0 とします。
  • i = 1 から i = N まで順に走査し、floor(sqrt(i)) == ceil(sqrt(i)) が成り立てば、i は平方数です。
  • さらに floor(cbrt(i)) == ceil(cbrt(i)) も成り立てば、i は立方数でもあるため、カウントを 1 増やします。
  • ループ終了後、count を結果として返します。

ここで floor()(切り捨て)と ceil()(切り上げ)の結果が一致するのは、sqrt() や cbrt() の戻り値がちょうど整数になるときだけです。これを利用して、その数がきれいな2乗・3乗であるかどうかを判別できます。

C++ サンプルコード

#include <bits/stdc++.h>
#include <math.h>
using namespace std;
int getCount(int n){
    int count=0;
    for(int i=1;i<=n;i++){
        if(floor(sqrt(i))==ceil(sqrt(i))){
            if(floor(cbrt(i))==ceil(cbrt(i))){
                count++;
                //cout<<i<<" ";
            }
        }
    }
    return count;
}
int main(){
    int N=100;
    cout<<endl<<"N以下の平方数かつ立方数である数の個数:"<<getCount(N);
    return 0;
}

実行結果

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

N以下の平方数かつ立方数である数の個数:2

補足:平方数かつ立方数となる数の性質

ある数が平方数であり、かつ立方数でもあるためには、その数が「6乗数(ある整数の6乗)」であれば十分です。実際、1 = 1⁶、64 = 2⁶、729 = 3⁶、4096 = 4⁶ という対応関係があります。つまり、答えは「N の6乗根の整数部分」と一致するため、ループ処理を使わずに高速に求めることも可能です。ただし、浮動小数点演算には誤差が伴うため、実装の際は誤差調整を行うか、本記事のように整数ループで確認する方法が安全です。

  1. C++で範囲内の数値のうち、その数字とqをかけた積に共通する数字がないものを数える方法

    この記事では、範囲を表す2つの整数 start と end、および整数 q が入力として与えられたとき、範囲内の数値のうち「その数値自身の数字と、qをかけた積の数字に共通する数字が1つも存在しない」ものの個数を求める方法を解説します。例えば、数値が 5 で q が 3 の場合、積は 15 となります。5 と 15 はどちらも数字「5」を含むため、共通する数字があります。一方、数値が 2 で q が 5 の場合、積は 10 となります。2 と 10 には共通する数字がないため、条件を満たします。例で理解しよう入力例1start = 5, end = 10, q = 2出力: 条件を満たす数値の個

  2. C++で重みが完全平方数となるノードを数える方法

    各ノードに重みが割り当てられた二分木が与えられたとき、「重みが完全平方数であるノード」の個数を求めるのが本記事の目的です。例えば、あるノードの重みが36であれば、36 = 6² と表せるため、このノードはカウント対象となります。例入力値を入力して作成される木は以下の通りです。出力Count the nodes whose weight is a perfect square are: 4説明各ノードとそれに対応する重みが与えられており、それぞれの重みが完全平方数かどうかを確認します。ノード重み完全平方数該当するか212111 × 11はい1819 × 9はい437素数(平方数ではない)いいえ3