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

C++의 네 약수


정수 배열 nums가 있다고 가정하고 정확히 4개의 제수가 있는 해당 배열에서 정수의 제수의 합을 찾아야 합니다. 따라서 배열에 그러한 정수가 없으면 0을 반환합니다. 예를 들어 입력이 [21, 4, 7]이면 출력은 32가 됩니다. 21은 4개의 제수 1, 3, 7, 21, 4는 3개의 약수 1, 2, 4, 7은 2개의 약수 1과 7을 가집니다. 답은 21의 약수만 합한 것입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • ok()라는 메서드를 정의하면 x가 입력으로 사용됩니다.

  • ret :=1 + x, cnt :=2

  • i의 경우 :=2, i^2 <=x, i를 1 증가

    • x가 i로 나누어 떨어지는 경우

      • ret를 i만큼 증가, cnt를 1만큼 증가

      • i가 x/i가 아니면 cnt를 1만큼 증가시킵니다. ret :=ret + (x/i)

  • cnt가 4이면 ret를 반환하고 그렇지 않으면 0을 반환

  • 주요 방법에서

  • ret :=0, n :=숫자 크기

  • 0 ~ n – 1 범위의 i에 대해

    • 렛 :=렛 + ok(숫자[i])

  • 리턴 렛

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int ok(int x){
      int ret = 1 + x;;
      int cnt = 2;
      for(int i = 2; i * i <= x; i++){
         if(x % i == 0){
            ret += (i);
            cnt++;
            if(i != x / i){
               cnt++;
               ret += (x / i);
            }
         }
      }
      return cnt == 4 ? ret : 0;
   }
   int sumFourDivisors(vector<int>& nums) {
      int ret = 0;
      int n = nums.size();
      for(int i = 0; i < n; i++){
         ret += ok(nums[i]);
      }
      return ret;
   }
};
main(){
   vector<int> v = {21,4,7};
   Solution ob;
   cout << (ob.sumFourDivisors(v));
}

입력

[21,4,7]

출력

32