【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乗根の整数部分」と一致するため、ループ処理を使わずに高速に求めることも可能です。ただし、浮動小数点演算には誤差が伴うため、実装の際は誤差調整を行うか、本記事のように整数ループで確認する方法が安全です。
-
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出力: 条件を満たす数値の個
-
C++で重みが完全平方数となるノードを数える方法
各ノードに重みが割り当てられた二分木が与えられたとき、「重みが完全平方数であるノード」の個数を求めるのが本記事の目的です。例えば、あるノードの重みが36であれば、36 = 6² と表せるため、このノードはカウント対象となります。例入力値を入力して作成される木は以下の通りです。出力Count the nodes whose weight is a perfect square are: 4説明各ノードとそれに対応する重みが与えられており、それぞれの重みが完全平方数かどうかを確認します。ノード重み完全平方数該当するか212111 × 11はい1819 × 9はい437素数(平方数ではない)いいえ3