c·c++/c 프로그래밍

소인수 분해 코드

바로이순간 2016. 7. 10. 14:13

[첫번째]

#include <stdio.h> 

int main() {

    int n,i=2; 

    scanf("%d",&n); 

    while(n>1) {

        if(i*i>n) {

            printf("%d ", n);

            break;

        } else if(n%i==0) { 

            printf("%d ",i);

            n=n/i;

        } else {

            i+=1;

        }

    }

    return 0; 

======================================

[두번째]

#include <stdio.h> 

int main() {

    int n,i=2; 

    scanf("%d",&n); 

    while(i*i<=n) { 

        if(n%i==0) { 

            printf("%d ",i);

            n=n/i;

        } else {

            i+=1;

        }

    }

    if(n>1) {

        printf("%d", n);

    }

    return 0; 

=====================================

[세번째]

#include<stdio.h>

int main(void) {

    int n, i;

    

    scanf("%d", &n);

    

    // 중복된 소인수 2를 모두 출력한다.

    while(n%2==0) {

        printf("2 ");

        n=n/2;

    }

    // 홀수 소인수를 모두 출력한다.

    // 홀수 소인수는 3부터 시작하여 2씩 더한다.

    // 만약 현재 소인수를 제곱한 수가 n보다 크다면 [아래쪽 참고]

    // 남아 있는 n은 1이 되었거나 아니면 i보다 큰 소인수이다.

    i=3;

    while(i*i<=n) {

        // 만약 n이 소인수 i를 가지면 그 소인수를 출력한다.

        if(n%i==0) {

            printf("%d ", i);

            n=n/i;

        // 소인수 i를 가지지 않으면 다음 홀수로 넘어 간다.

        } else {

            i+=2;

        }

    }

    // 만약 n이 1보다 크면 n을 출력해 준다.

    if(n>1) {

        printf("%d", n);

    }

    return 0;

}

// 만약 n이 97이라면 소수이다. 위의 루프에서는

// i의 값이 11일 경우 n이 i*i보다 작기 때문에 while문이 끝이 난다.

// 위와 같이 해주면 반복회수를 줄일 수 있다

'c·c++ > c 프로그래밍' 카테고리의 다른 글

실력 테스트 문제  (0) 2020.02.10
개미수열-보충과제 모음:  (0) 2020.02.10
maximum sum subarray(배열의 최대합 구간)  (0) 2016.04.08
quick sort  (0) 2015.10.01
하노이탑 - 반복문사용  (0) 2015.09.20