2019년 4월 13일 토요일

# 약수의 합 구하기

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//http://bhsmath.tistory.com/52
//https://kldp.org/node/36453
/*
 입력받은 숫자를 소인수 분해 한다.
  -> 분해된 소인수들의 각 합을 구해 서로 곱한다.
  {ex: 2^2, 3^2의 소인수들을 얻었다면,  (1 + 2^1 + 2^2) x ( 1 + 3^1 + 3^2 )}
*/
int SumOfDivisors(int n) {
 if (n == 0) return 0;

 vector<int> factorSums;
 int max = (int)sqrt(n);
 for (int factor = 2; factor <= max; factor++) {
  int pow = 1, factorSum = 1;
  while (n % factor == 0) {
   n /= factor;
   factorSum += CustomPow(factor, pow);
   pow++;
  }
  if (factorSum > 1) {
   factorSums.push_back(factorSum);
  }
 }
 if (n > 1) {
  factorSums.push_back(n+1);
 }

 int sumDivisors = 1;
 for (auto s : factorSums) {
  sumDivisors *= s;
 }
 return sumDivisors;
}

 int CustomPow(int num, int pow) {
  int sum = 1;
  while (pow > 0) {
   sum *= num;
   pow--;
  }
  return sum;
 }

댓글 없음:

댓글 쓰기