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

C++で自然数のすべての約数の約数の合計を求めます


この問題では、自然数Nが与えられます。私たちのタスクは、自然数のすべての約数の約数の合計を見つけることです。 。

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

Input : N = 12
Output : 55

説明

The divisors of 12 are 1, 2, 3, 4, 6, 12
Sum of divisors = (1) + (1 + 2) + (1 + 3) + (1 + 2 + 4) + (1 + 2 + 3 + 6) + (1 + 2 + 3 + 4 + 6 + 12) = 1 + 3 + 4 + 7 + 12 + 28 = 55

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

この問題の簡単な解決策は、Nの因数分解を使用することです。素因数分解を使用すると、すべての除数の約数の合計を見つけることができます。ここでは、各要素の素因数分解を見つけます。

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

#include<bits/stdc++.h>
using namespace std;
int findSumOfDivisorsOfDivisors(int n) {
   map<int, int> factorCount;
   for (int j=2; j<=sqrt(n); j++) {
      int count = 0;
      while (n%j == 0) {
         n /= j;
         count++;
      }
      if (count) 
         factorCount[j] = count;
   }
   if (n != 1)
      factorCount[n] = 1;
   int sumOfDiv = 1;
   for (auto it : factorCount) {
      int power = 1; 
      int sum = 0;
      for (int i=it.second+1; i>=1; i--) {
         sum += (i*power);
         power *= it.first;
      }
      sumOfDiv *= sum;
   }
   return sumOfDiv;
}
int main() {
   int n = 12;
   cout<<"The sum of divisors of all divisors is "<<findSumOfDivisorsOfDivisors(n);
   return 0;
}

出力

The sum of divisors of all divisors is 55

  1. C++のすべてのサブシーケンスの合計を求めます

    n個の要素を持つ配列Aがあるとします。配列のすべてのサブセットの合計の合計を見つける必要があります。したがって、配列がA =[5、6、8]の場合、-のようになります。 サブセット 合計 5 5 6 6 8 8 5,6 11 6,8 14 5,8 13 5,6,8 19 合計 76 配列にはn個の要素があるため、2n個のサブセット(空を含む)があります。はっきりと観察すると、各要素が2n〜1回発生していることがわかります 例 #include<iostream> #includ

  2. C++で階乗がxで割り切れる最初の自然数を見つけます

    階乗がxで割り切れる最初の自然数を見つけなければなりません。 xはユーザーによって指定されます。したがって、x =16の場合、出力は6になります。 mod16=0。この問題を解決するために一般的なアプローチを使用します。 1!、2!、…を繰り返しカウントします。 n! xを使用して除算性を確認します。モジュラスが0の場合は、停止して数値を返します。 例 #include<iostream> using namespace std; int getNumber(int x) {    int fact = 1;    int i = 0; &n