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

完全平方数(パーフェクトスクエア)かどうかを判定するアルゴリズムとC++実装

ある数の平方根が整数になるとき、その数は完全平方数(パーフェクトスクエア)と呼ばれます。つまり、平方根が整数値になるような数が完全平方数です。例えば、4 の平方根は 2、25 の平方根は 5 であるため、どちらも完全平方数です。

完全平方数を判定する最も基本的な方法は、対象の数の平方根を求め、それが整数に一致するかどうかを繰り返し確認することです。計算した二乗の値が対象の数を超えた時点で一致しなければ、その数は完全平方数ではありません。

ただし、この記事では処理を効率化するため、平方根を何度も再計算する方式は採用していません。完全平方数の平方根は必ず整数になるという性質を利用し、候補となる平方根を 1 ずつ増やしながら、その二乗が対象の数と一致するかどうかを順番にチェックします。これにより、無駄な計算を省き、シンプルかつ確実な判定が可能になります。

入力と出力

入力:
判定する数: 1032

出力:
1032 は完全平方数ではありません。

アルゴリズム

判定関数 isPerfectSquare(num) の流れは以下の通りです。

入力: 判定対象の数。

出力: 対象の数が完全平方数であれば true(平方根の値も返す)。そうでなければエラーを返す。

Begin
    if num < 0, then
        exit
    sqRoot := 1
    sq := sqRoot^2
    while sq <= num, do
        if sq = num, then
            return sqRoot
        sqRoot := sqRoot + 1
        sq := sqRoot^2
    done
    otherwise return error
End

アルゴリズムのポイント

  • 負の数は平方根を持たないため、最初に除外します。
  • 候補の平方根 sqRoot を 1 から開始し、その二乗が対象の数以下である間ループを続けます。
  • 二乗した値が対象の数と一致すれば、その時点の sqRoot が答えとなります。
  • 二乗した値が対象の数を超えたら、完全平方数ではないと判断できます。

C++による実装例

#include<iostream>
using namespace std;

int isPerfectSquare(int num) {
    if(num < 0)
        return -1;          // 負の数は有効な平方数ではない
    int sqRoot = 1, sq;

    while((sq =(sqRoot*sqRoot)) <= num) {   // 二乗値が対象の数を超えていない間繰り返す
        if(sq == num)
            return sqRoot;
        sqRoot++;           // 完全平方数の平方根は必ず整数なので1ずつ増やす
    }
    return -1;
}

int main() {
    int num, res;
    cout << "Enter a number to check whether it is perfect square or not: ";
    cin >> num;

    if((res = isPerfectSquare(num)) != -1)
        cout << num << " is a perfect square number, square root: " << res;
    else
        cout << num << " is not a perfect square number.";
}

実行結果

Enter a number to check whether it is perfect square or not: 1032
1032 is not a perfect square number.

このプログラムでは、1032 を入力すると、1²=1、2²=4、…と順に確認していきますが、32²=1024、33²=1089 となり、1032 に一致する整数の二乗は存在しないため、「完全平方数ではない」という結果が出力されます。逆に、例えば 1024 を入力すれば、平方根 32 が返され、完全平方数であると判定されます。

  1. C言語でアームストロング数を判定する方法

    問題 C言語を使って、入力された数値がアームストロング数(Armstrong number)であるかどうかを判定するには、どのようにプログラムを書けばよいのでしょうか? 解決策 アームストロング数とは、各桁の数字を桁数乗した値の総和が、元の数値と等しくなる数のことです。3桁の数値であれば、「各桁の数字の3乗の合計」が元の数値に一致します。 構文 pqrs……=pow(p,n)+pow(q,n)+pow(r,n)+……. 例えば、153、371、1634などはアームストロング数として知られています。 153=1*1*1 + 5*5*5

  2. C言語でプラス完全数(Armstrong数)を判定するプログラム

    n桁の整数xが与えられたとき、その数が「プラス完全数(Plus Perfect Number)」であるかどうかを判定するのが本記事のテーマです。プラス完全数とは、各桁の数字dを桁数nでべき乗した値(dn)をすべて合計し、その合計が元の数と一致する場合を指します。この考え方は、いわゆる「Armstrong数(ナルシシスト数)」の判定とまったく同じものです。 具体例 入力:163 出力:完全数ではない 説明:1³ + 6³ + 3³ = 244 となり、163と一致しないため 入力:371 出力:完全数である 説明:3³ + 7³ + 1³ = 371 となり、元の数と一致するため 上記の例のよ