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

C++で数値がトロイ数(Trojan Number)かどうかを判定する方法


概念

与えられた数 n がトロイ数(Trojan Number)であるかどうかを判定するのが本記事のテーマです。トロイ数とは、「強い数(Strong Number)」の性質を持ちながら、累乗数(perfect power)ではない数として定義されます。

ある数 n が強い数であるとは、n のすべての素因数 p について、p2 もまた n の約数となっていることを意味します。言い換えれば、すべての素因数が少なくとも2回以上現れる数のことです。

ここで重要なのは、すべてのトロイ数は必ず強い数ですが、その逆は成り立たないという点です。つまり、強い数すべてがトロイ数というわけではなく、ab(a、b はともに1より大きい正の整数)の形で表せないものだけがトロイ数となります。

具体例

入力

n = 72
72 は 6×6×2、すなわち (6^2)×2 と表せるため強い数ですが、累乗数ではありません。

出力

YES

入力

n = 16
16 は 2×2×2×2、すなわち 2^4 と表せるため強い数ですが、累乗数にもなっています。

出力

NO

アルゴリズムの考え方

判定は以下の手順で行います。

ステップ1: 素因数分解を行い、各素因数の出現回数を記録します。すべての素因数が2回以上出現していれば、その数は強い数であると判定できます。

ステップ2: 与えられた数が ab の形で表せるかどうか(累乗数かどうか)を確認します。ab の形で表せない場合、その数は累乗数ではありません。

ステップ3: 数が「強い数」であり、かつ「累乗数でない」とき、その数はトロイ数であると結論付けられます。

サンプルコード

// 数がトロイ数(Trojan Number)かどうかを
// 判定するC++プログラム
#include <bits/stdc++.h>
using namespace std;
bool isPerfectPower1(int n1){
    if (n1 == 1)
        return true;
    for (int x1 = 2; x1 <= sqrt(n1); x1++) {
        int y1 = 2;
        int p1 = pow(x1, y1);
        while (p1 <= n1 && p1 > 0) {
            if (p1 == n1)
                return true;
            y1++;
            p1 = pow(x1, y1);
        }
    }
    return false;
}
bool isStrongNumber1(int n1){
    unordered_map<int, int> count1;
    while (n1 % 2 == 0) {
        n1 = n1 / 2;
        count1[2]++;
    }
    for (int i1 = 3; i1 <= sqrt(n1); i1 += 2) {
        while (n1 % i1 == 0) {
            n1 = n1 / i1;
            count1[i1]++;
        }
    }
    if (n1 > 2)
        count1[n1]++;
    int flag1 = 0;
    for (auto b : count1) {
        if (b.second == 1) {
            flag1 = 1;
            break;
        }
    }
    if (flag1 == 1)
        return false;
    else
        return true;
}
bool isTrojan1(int n1){
    if (!isPerfectPower1(n1) && isStrongNumber1(n1))
        return true;
    else
        return false;
}
// メイン関数
int main(){
    int n1 = 72;
    if (isTrojan1(n1))
        cout << "YES";
    else
        cout << "NO";
    return 0;
}

実行結果

YES

  1. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ

  2. C++で数値が2つの三角数の和として表現できるか判定する方法

    本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ