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

C++で指定された要素数から作成できる(異なる次数の)行列の数を求める方法

問題概要

本記事では、要素の総数が与えられたときに、そのデータから形成できる異なる次数(サイズ)の行列の総数を求める方法を解説します。行列の次数は m×n という形式で表され、m は行数、n は列数を表します。

例 1

入力: int numbers = 6

出力: 与えられた要素数から形成できる異なる次数の行列の数: 4

解説: 行列に含められる要素の総数として 6 が与えられています。6 個の要素から作成できる行列の次数は (1, 6)、(2, 3)、(3, 2)、(6, 1) の 4 通りです。

例 2

入力: int numbers = 40

出力: 与えられた要素数から形成できる異なる次数の行列の数: 8

解説: 要素の総数として 40 が与えられています。40 個の要素から作成できる行列の次数は (1, 40)、(2, 20)、(4, 10)、(5, 8)、(8, 5)、(10, 4)、(20, 2)、(40, 1) の 8 通りです。

アルゴリズムの考え方

  • 異なる次数の行列を作成するために使用できる要素の総数を入力します。
  • 計算処理を行うため、その値を関数に渡します。
  • 異なる次数の行列の個数を保持する一時変数 count を用意します。
  • i を 1 から number まで順に処理する FOR ループを開始します。
  • ループ内で number % i == 0 が成立する場合(i が number の約数である場合)、count を 1 増やします。
  • count を返します。
  • 結果を出力します。

この問題は、実質的に「与えられた数の約数の個数を求める」問題と同じです。行数 m を決めれば列数 n は「要素数 ÷ m」として自動的に決まるため、要素数の約数がいくつあるかを数えれば、それがそのまま答えになります。

サンプルコード

#include <iostream>
using namespace std;

// 指定された要素数を持つ(異なる次数の)行列の数を数える関数
int total_matrices(int number){
    int count = 0;
    for (int i = 1; i <= number; i++){
        if (number % i == 0){
            count++;
        }
    }
    return count;
}

int main(){
    int number = 6;
    cout<<"与えられた要素数から形成できる異なる次数の行列の数: "<<total_matrices(number);
    return 0;
}

出力

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

与えられた要素数から形成できる異なる次数の行列の数: 4

計算量について

このアルゴリズムの時間計算量は O(N)、空間計算量は O(1) です。N が大きい場合は、1 から √N までだけを調べることで、時間計算量を O(√N) まで改善することも可能です。

  1. C++で数値Nを割り切る桁の個数を数える方法

    整数 N が与えられ、その数値を構成する各桁のうち、元の数値 N を割り切るものの個数を求めることを考えます。 注意すべきポイント 桁が「0」である場合は無視します。つまり、0 に対してはカウントを増やしません。 同じ数字が複数回現れ、かつそれが数値を割り切る場合には、出現した回数だけカウントします。たとえば 2240 という数値の場合、0 以外のすべての桁が 2240 を割り切ることができ、2 は2回出現しているので、2 に関するカウントは 2 になります。 入力 − number = 2240 出力 − カウントは 3 説明 − 数値を桁に分解すると 2、2、4、0 となります。

  2. 【C++】配列内の2つの指定された要素間にある要素数をカウントする方法

    はじめに整数要素を含む配列と、2つの値「start(開始)」と「end(終了)」が与えられたとき、配列内でこの2つの要素の間に存在する要素の個数を求める問題を考えます。本記事では、C++を用いてこの問題を解く具体的な手順を解説します。配列とは、同じ型の要素を固定サイズで連続的に格納できるデータ構造の一種です。複数のデータをまとめて管理できるため、同じ型の変数の集まりとして考えると理解しやすくなります。なお、start要素が配列内に複数回出現する場合は最初の出現位置を採用し、end要素が複数回出現する場合は最後の出現位置を採用してカウントするのがポイントです。具体例入力: int arr[] =