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

C++のnのすべての除数で最大の桁数の合計を求めます


この問題では、整数nが与えられます。私たちのタスクは、nのすべての除数で最大の桁の合計を見つけることです。

問題の説明: ここでは、桁の合計が最大である数nの約数を見つけます。

問題を理解するために例を見てみましょう。

入力: 18

出力: 9

説明:

18の約数はすべて1、2、3、6、9、18です。

最大桁数の合計は9です。

ソリューションアプローチ

数値Nのすべての除数を見つけます。次に、各除数の桁の合計を見つけて、合計が最大の値を返します。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;

int calcDigitSum(int n) {
   
   int sum = 0;
   while (n != 0) {
      sum = sum + n % 10;
      n = n/10;
   }
   return sum;
}

int largestDigitSumdivisior(int n) {
   
   int maxSum = 0;
   for (int i = 1; i <= n; i++)
      if (n % i == 0)
      maxSum = max(maxSum, calcDigitSum(i));

   return maxSum;
}

int main() {
   
   int n = 45;
   cout<<"The divisor with largest sum of digits is "<<largestDigitSumdivisior(n)<<endl;
   return 0;
}

出力

The divisor with largest sum of digits is 9

除数を見つけるためにメソッドを変更し、それをより効果的にすることで、ソリューションをより効果的にすることができます。

この問題では、sqrt(n)まで反復し、すべての除数と他の約数がn/divを使用して計算されていることを確認します。これにより、sqrt(n)の除数を見つけるための時間計算量が削減されます。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;

int calcDigitSum(int n) {
   
   int sum = 0;
   while (n != 0) {
      sum = sum + n % 10;
      n = n / 10;
   }
   return sum;
}

int largestDigitSumdivisior(int n) {
   
   int maxSum = 0;
   for (int i = 1; i*i <= n; i++) {

      if (n % i == 0) {
         maxSum = max(maxSum, calcDigitSum(i));
         maxSum = max(maxSum,calcDigitSum(n/i));
      }  
   }
   return maxSum;
}

int main() {
   
   int n = 32;
   cout<<"The divisor with largest sum of digits is "<<largestDigitSumdivisior(n)<<endl;
   return 0;
}

出力

The divisor with largest sum of digits is 8

  1. C++のツリーで最大のサブツリーの合計を検索します

    この問題では、二分木が与えられます。私たちのタスクは、ツリー内で最大のサブツリーの合計を見つけることです。 問題の説明: 二分木は、正の値と負の値で構成されます。そして、ノードの合計が最大のサブツリーを見つける必要があります。 問題を理解するために例を見てみましょう。 出力: 13 説明: 左サブツリーの合計は7です 右サブツリーの合計は1です ツリーの合計は13です ソリューションアプローチ この問題を解決するために、ポストオーダートラバーサルを実行します。ノードの左側のサブツリーと右側のサブツリーの合計を計算します。現在のノードについて、現在のノードの

  2. C ++で配列のすべての個別のサブセット(またはサブシーケンス)の合計を検索します

    整数のセットがあるとします。与えられたセットのサブセットから形成できる明確な合計を見つけて、昇順で印刷します。配列要素の合計は小さいです。配列要素が[1、2、3]のようなものだと考えてください。出力は0、1、2、3、4、5、6になります。個別のサブセットは{}、{1}、{2}、{3}、{1、2}、{2、3}、{1です。 、3}、{1、2、3}、合計値は0、1、2、3、3、5、4、6です。 これを解決するために、動的計画法のアプローチを使用します。指定された要素の合計が小さい場合、配列のサイズを含む行を含むDPテーブルを作成できます。列のサイズは、指定された配列内のすべての要素の合計になります