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

C++で数Nをk個の数の積として表現できるかどうかを判定する方法

数Nと整数kが与えられたとき、Nをk個の数(1より大きい数)の積として表現できるかどうかを判定する方法を解説します。例えば、N=54、k=3が与えられた場合、54 = 2 × 3 × 9 と分解できるため「2, 3, 9」のように出力します。表現できない場合は、その旨を出力します。

アルゴリズムの考え方

この問題を解くには、まずNのすべての素因数を求め、それらをvectorに格納します。1より大きいk個の数を得るには、vectorのサイズがk以上であるかを確認します。サイズがk未満の場合は「-1」を返して表現不可を示します。サイズがk以上であれば、最初のk-1個の因数をそのまま出力し、最後の数は残りの因数すべての積とします。

例えば54を素因数分解すると 2 × 3 × 3 × 3 となり、素因数は4個あります。k=3の場合、最初の2個(2, 3)を出力し、残りの因数(3 × 3 = 9)を積として最後の数にします。この方法により、常にk個の数でNを表現できます。

サンプルコード

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int getKFactors(int n, int k){
   int i;
   vector<int> vec;
   while(n % 2 == 0){
      vec.push_back(2);
      n = n/2; //2で割り続けてnを減らす
   }
   for(i = 3; i <= sqrt(n); i=i+2){ //2ずつ増やして奇数のみを判定
      while(n % i == 0){
         n = n/i;
         vec.push_back(i);
      }
   }
   if(n > 2){
      vec.push_back(n);
   }
   if(vec.size() < k){
      cout << "Cannot be represented";
      return -1;
   }
   for (int i=0; i<k-1; i++)
   cout << vec[i] << ", ";
   int prod = 1;
   for (int i=k-1; i<vec.size(); i++)
   prod = prod*vec[i];
   cout << prod << endl;
}
int main() {
   int n = 54, k = 3;
   getKFactors(n, k);
}

出力結果

2, 3, 9

このコードでは、まず2で割り切れる間は2を因数として追加し、その後3から√Nまでの奇数で割り切れる間、因数として追加していきます。最後に2より大きい数が残っていれば、それも素因数としてvectorに加えます。素因数の個数がk未満であれば表現できないため「-1」を返し、十分な個数があれば最初のk-1個と残りの積を出力します。

  1. 【C++】配列内のすべての素数の積を求める方法

    整数型配列 arr[] が与えられたとき、その配列に含まれるすべての素数を見つけ出し、それらの積を計算するのが本記事のテーマです。素数とは、1とその数自身でしか割り切れない正の整数のことです。たとえば、2、3、5、7、11などが素数に該当します。それでは、次の配列を例に解を求めてみましょう。入力: arr[] = { 11, 20, 31, 4, 5, 6, 70 }出力: 1705説明: 配列内の素数は 11、31、5 の3つであり、その積は 11 × 31 × 5 = 1705 となります。入力: arr[] = { 1, 2, 3, 4, 5, 6, 7 }出力: 210説明: 配列内の

  2. 【C++入門】2つの数値を乗算するプログラムの書き方

    乗算(掛け算)の基本 2つの数値 a と b の乗算とは、両者を掛け合わせて「積」を求める計算のことです。概念的には、a の値を b の回数分だけ足し合わせることで、a と b の積を求めることができます。 例: 5 * 4 = 20 7 * 8 = 56 9 * 9 = 81 *演算子を使って2つの数値を乗算するプログラム C++では、* 演算子を使用することで、2つの数値の積をシンプルに計算できます。以下は、* 演算子を使って2つの数値を乗算するプログラムです。 サンプルコード #include <iostream> using namespace std; int main