Algorithm

N!의 표현법

욜스터 2021. 1. 18. 17:44
728x90

문제

 

코드 - C /C++언어

-접근한 방식

 

5 = 5 * 4 * 3 * 2 * 1 = 120

120의 소수들의 곱을 찾는게 아니라 5부터 하나씩 소수들의 곱으로 만들어서 구해본다.

 

1. N을 입력받고 

2. 2부터 N까지 반복문을 돌려서 해당 값을 소수들의 곱으로 만들어 구한다.

3. prime이라는 배열에 구해진 소수들을 index로 가지는 값을 +1 

4. 출력할때 index가 소수인지 확인 후, 그 값을 출력

 

-내가 작성한 코드

#include <stdio.h>

void findprime(int *arr, int a){
    int index = 0;
    int now = a;
    for(int i = 2; i <= now; i++){
        if(now%i == 0){
            now = now/i;
            arr[i]++;
            i = 1;
        }
    }
}

int isprime(int num){
    int check=1;
    for(int i = 2; i < num; i++){
        if(num%i==0){ 
            check=0;
            break;
        }
    }
    return check;
}

int main()
{
    int N;
    int prime[101]= {0};
    
    scanf("%d", &N);
    
    for(int i = 2; i <= N; i++){
        findprime(prime, i);
    }

    for(int i = 2; i <= N; i++){
        if(isprime(i)) printf("%d ", prime[i]);
    }
    
    return 0;
}

 

 

-모범답안

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
   freopen("input.txt", "rt", stdin);
   int n, i, j, tmp;
   scanf("%d", &n);
   vector<int> ch(n+1);
   for(i = 2; i <=n; i++){
      tmp = i;
      j=2;
      while(1){
         if(tmp%j==0){
            ch[j]++;
            tmp=tmp/j;
         }

         else j++;
         if(tmp==1) break;
      }

   printf("%d! = ", n);
   for(j = 2; j<=n; j++){
      if(ch[j]!=0)printf("%d ", ch[j]);
   }
   return 0;
}

 

findprime함수에서 i값을 1로 다시 초기화해서 반복문이 다시 시작하게끔 했는데,

모범답안처럼 무한반복문을 사용하는 것이 더 좋을 것 같다!

 

그리고 출력할 때 index값이 소수인지 아닌지 확인해서 출력을 했는데,

그냥 배열의 값이 0인지 아닌지 확인해서 출력하는 것이 맞는거 같다!

 

 

728x90
반응형

'Algorithm' 카테고리의 다른 글

영지 선택(2차원 배열 구간합, DP)  (0) 2021.02.03
이분검색  (0) 2021.01.29
[개념] 정렬 알고리즘  (0) 2021.01.25
[개념] 탐색(검색) 알고리즘  (0) 2021.01.25
N!에서 0의 개수  (0) 2021.01.22