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

C++で平方数の和を判定するアルゴリズムを解説

問題の概要

負でない整数 c が与えられたとき、a² + b² = c を満たす2つの整数 a と b が存在するかどうかを判定する問題です。

例えば、入力が 61 の場合、61 = 5² + 6² と表せるため、出力は True になります。

解法のアプローチ

この問題は、0 から √c までの各整数 i について「c − i² が完全平方数であるか」を順に調べることで解けます。以下の手順に従います。

  • 関数 isPerfect() を定義します。引数として x を受け取ります。
  • sr := x の平方根 を計算します。
  • (sr − sr の切り捨て値) が 0 であれば true を返します。これにより x が完全平方数かどうかを判定できます。
  • メインの処理では以下を行います。
  • c が 0 と等しい場合は true を返します。
  • i を 0 で初期化し、i が √c の切り上げ値未満である間、i を1ずつ増やしながら以下を繰り返します。
    • b := c − i × i を計算します。
    • isPerfect(b) が true であれば、true を返します。
  • ループが終了しても見つからなければ、false を返します。

実装例

理解を深めるために、以下の C++ 実装を見てみましょう。

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
    bool isPerfect(int x){
        long double sr = sqrt(x);
        return ((sr - floor(sr)) == 0);
    }
    bool judgeSquareSum(int c) {
        if (c == 0)
            return true;
        int b;
        for (int i = 0; i < ceil(sqrt(c)); i++) {
            b = c - i * i;
            if (isPerfect(b))
                return true;
        }
        return false;
    }
};
main(){
    Solution ob;
    cout << (ob.judgeSquareSum(61));
}

入力

61

出力

1

計算量の評価

このアルゴリズムの時間計算量は O(√c) です。i を √c まで走査し、各ステップで平方根の判定を行うためです。空間計算量は O(1) で、追加のメモリはほとんど必要ありません。平方根の計算には浮動小数点数の誤差がつきものなので、サンプルコードのように long double を使うことで精度を高めています。

補足:二ポインタ法による別解

同様の問題は、左端を 0、右端を √c とした二ポインタ法でも解けます。a² + b² の値が c より小さければ左ポインタを、大きければ右ポインタを動かすことで、同じく O(√c) の計算量で判定できます。浮動小数点誤差を避けたい場合は、整数演算のみで完結するこの方法も有効です。

  1. 自然数の合計を計算するC++プログラム:forループと公式の2つの方法を解説

    自然数とは、1から始まる正の整数のことです。自然数の列は以下のように続きます。1, 2, 3, 4, 5, 6, 7, 8, 9, 10……最初のn個の自然数の合計は、forループを使う方法と、数学の公式を使う方法の2通りで求めることができます。それぞれの方法によるプログラムを以下に示します。forループを使って自然数の合計を求めるforループを使用してn個の自然数の合計を計算するプログラムは次のとおりです。サンプルコード#include<iostream> using namespace std; int main() { int n=5, sum=0, i; f

  2. C++で2つの数値を加算するプログラムの書き方【サンプルコード付き】

    加算(足し算)は、最も基本的な算術演算の一つです。2つの数値を加算するプログラムは、指定された2つの数値の合計を計算し、その結果を画面に表示します。この記事では、C++で2つの数値を加算する方法を、変数を使った基本例と配列を使った応用例の2パターンに分けて解説します。例1:変数を使って2つの数値を加算するまずは、最もシンプルな方法です。2つの整数型変数を用意し、その合計を別の変数に格納して出力します。#include <iostream> using namespace std; int main() { int num1 = 15, num2 = 10, sum;