Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 두 개의 풍부한 숫자의 합으로 숫자를 표현할 수 있는지 확인

<시간/>

숫자가 있다고 가정해 보겠습니다. 우리는 이것을 두 개의 풍부한 숫자의 합으로 표현해야 합니다. 그렇다면 숫자를 인쇄하고, 그렇지 않으면 -1을 인쇄하십시오. 숫자는 숫자라고 합니다. 풍부한 숫자는 숫자의 모든 고유 약수의 합이며 sum(n)으로 표시되는 숫자는 숫자의 값보다 큽니다.

이를 해결하기 위해 모든 풍부한 수를 집합에 저장하고 주어진 수 n에 대해 i =1에서 n에 대한 루프를 실행하고 n과 (n – i)가 풍부한지 확인합니다.

예시

#include <iostream>
#include <set>
#define N 100005
using namespace std;
set<int> getAbundantSet() {
   set<int> abundant_set;
   for (int i = 1; i < N; i++) {
      int sum = 1;
      for (int j = 2; j * j <= i; j++) {
         if (i % j == 0) {
            sum += j;
            if (i / j != j)
            sum += i / j;
         }
      }
      if (sum > i)
         abundant_set.insert(i);
   }
   return abundant_set;
}
void representSumAbundant(int number){
   set<int> abundant_set = getAbundantSet();
   for (int i = 1; i <= number; i++) {
      if (abundant_set.count(i) && abundant_set.count(number - i)) {
         cout << i << " " << number - i;
         return;
      }
   }
   cout << -1;
}
int main() {
   int n = 30;
   representSumAbundant(n);
}

출력

12 18