촉촉한초코칩

[백준] 11653(소인수분해) c언어 본문

Algorithm

[백준] 11653(소인수분해) c언어

햄친구베이컨 2023. 7. 9. 23:37

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.

 


 

 

#include <stdio.h>

int main(void) {

  //A : 소인수분해한 값 넣을 배열
  //T : 분해한 소인수들을 저장할 배열의 첨자용 변수
  int num, A[20], T = 0;
  scanf("%d", &num);

  do {
    if(num >= 2) {
      int P = 2; //num을 나누는 수(2~N)
      //2~N까지 num과 p 나누기
      for(; P<=num; P++) {
        if(num%P==0) //만약 0이라면 소수인
          break;
      }

      //T번째에 P 넣기
      A[T] = P;
      //num에 P로 나눈 몫 넣기
      num/=P;
      T++;
    }
    else //num이 1이하라면 나가기 
      return 0;
  } while(num != 1);

  //T가 1이다. 즉, 자기 자신이 소수인 경우 
  if(T == 1)
    printf("%d\n", A[0]);
  else {
    for(int j=0; j<T-1; j++) 
      printf("%d\n", A[j]);
    printf("%d\n", A[T-1]);
  }
}

 

작년 수업시간에 들었던 수업에서 코드 복붙..ㅎ

  1. 2부터 num까지 반복해서 나눈 나머지가 0인지 확인하고 
  2. 0이 아니라면 아직 소수가 아니라는 뜻이므로 배열 A에 나머지 저장, num에는 몫을 저장해서 다시 나눈다.
  3. 마지막에 j로 for문을 T-1까지 돌리고 따로 배열 마지막 값을 출력하는데 이건 왜 그런건지 모르겠다..
    for문을 T까지 돌리고 출력한 코드를 제출하면 틀렸다고 뜬다. (이유를 모르겠다..)

 

코드 제출하고 나니까 쉬운데 왜 나 혼자서는 못 짜겠지...(사실 귀찮은걸지도)

좀 하려고 노력하자...