검수요청.png검수요청.png

"소인수분해"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
3번째 줄: 3번째 줄:
 
==개요==
 
==개요==
 
소수는 1을 제외한 자연수 중에서 약수가 1과 자기 자신밖에 없는 자연수를 말한다. 소인수는 소수의 곱으로 나타낸 수를 말하고 소인수분해는 그 소인수들을 분해해서 소수를 나열한 것이다. 예를 들어, 12의 소인수분해는 <math>2\times2\times3</math>으로 분해되고 이것을 정리하여 <math>2^2\times3</math>의 형태로 나타낸다. 결과적으로 소인수분해는 어떠한 수를 소수로 분해하여 곱셈의 형식으로 표기하는 것이다.
 
소수는 1을 제외한 자연수 중에서 약수가 1과 자기 자신밖에 없는 자연수를 말한다. 소인수는 소수의 곱으로 나타낸 수를 말하고 소인수분해는 그 소인수들을 분해해서 소수를 나열한 것이다. 예를 들어, 12의 소인수분해는 <math>2\times2\times3</math>으로 분해되고 이것을 정리하여 <math>2^2\times3</math>의 형태로 나타낸다. 결과적으로 소인수분해는 어떠한 수를 소수로 분해하여 곱셈의 형식으로 표기하는 것이다.
 +
 +
==예제==
 +
* C언어
 +
#include <stdio.h>
 +
 
 +
void factorization(){
 +
    int n;
 +
    while(1){
 +
        printf("Input: ");
 +
        scanf("%d",&n);
 +
 
 +
        if(n<2) return;
 +
        int p=2;
 +
        int primes[20];
 +
        int index=0;
 +
        int i;
 +
 
 +
        while(n!=1){
 +
            if(n%p==0){
 +
                n=n/p;
 +
                primes[index]=p;
 +
                index++;
 +
                p=2;
 +
            }
 +
            else{
 +
                p++;
 +
            }
 +
        }
 +
 
 +
        if(index==1) printf("소수\n");
 +
        else{
 +
            for(i=0; i<index-1; i++){
 +
                printf("%d*",primes[i]);
 +
            }
 +
            printf("%d\n",primes[i]);
 +
        }
 +
    }
 +
}
 +
 +
int main(void){
 +
    factorization();
 +
    return 0;
 +
}
 +
 +
: 코드의 결합도를 낮추고 응집도를 높이기 위해 main() 함수에서는 factorization() 함수를 호출만 하도록 하였다. factorization() 함수에서는 일단 처리할 숫자 n을 정수형으로 선언하고 무한루프안에서 scanf 를 통해 사용자로부터 입력받는다. n이 2보다 작으면 함수를 종료시키고 그게 아니면 필요한 변수들을 선언하기 시작한다. 우선 p는 2로 초기화되는데 이건 숫자 n을 나누어 떨어지게 하면 소인수분해의 결과 중 하나가 되는 후보의 역할이다. primes[20]은 소인수분해의 결과를 저장해두기 위한 정수형 배열이고 index는 primes배열에 인덱스 0부터 차곡차곡 소인수들을 넣기 위한 인덱스 변수이다. 그리고 출력에 사용할 반복용 변수 i 가 있다. 알고리즘은 n이 1이 될때까지 계속 루프를 돌리는데 n을 p로 나눈 나머지가 0이면 p는 소인수가 되므로 p를 primes[]의 적절한 위치에 넣고 index를 1 증가시킨다. 또한 n에는 n을 p로 나눈 값이 다시 할당된다. 그리고 p에 초기값 2를 다시 할당 한 다음 루프의 처음으로 돌아간다. n을 p로 나눈 나머지가 0이 아니면 p는 n의 소인수가 아니므로 p를 1 증가시킨 후 다시 루프의 처음으로 돌아간다. n이 1이 되면 완전히 나누어 떨어져 더이상 소인수를 찾을 수 없으므로 소인수분해 찾기는 종료된다. 이때 index가 1이라면 이건 0번 인덱스에 하나의 숫자만 들어갔다는 뜻이 되므로 그 수는 소수라고 할 수 있다. 따라서 소수라고 출력해주고 아니라면 for문에서 반복용 변수 i를 이용해 결과값을 하나씩 출력해준다. 이때 주의사항은 현재 index라는 값은 실제 유효한 값이 들어있는 마지막 인덱스보다 1 크다는 것이다. 따라서 primes[] 배열의 인덱스 index-1까지의 값을 출력해줘야 하는데 마지막 값을 출력한 이후에는 index-2 까지 (숫자)<sup>x</sup> 를 출력해주고 index-1은 그냥 숫자만 출력 후 줄바꿈해준다.
 +
 +
  
 
{{각주}}  
 
{{각주}}  

2019년 8월 1일 (목) 17:11 판

소인수분해합성수소수들만의 곱으로 나타내는 것을 말한다.

개요

소수는 1을 제외한 자연수 중에서 약수가 1과 자기 자신밖에 없는 자연수를 말한다. 소인수는 소수의 곱으로 나타낸 수를 말하고 소인수분해는 그 소인수들을 분해해서 소수를 나열한 것이다. 예를 들어, 12의 소인수분해는 으로 분해되고 이것을 정리하여 의 형태로 나타낸다. 결과적으로 소인수분해는 어떠한 수를 소수로 분해하여 곱셈의 형식으로 표기하는 것이다.

예제

  • C언어
#include <stdio.h>
 
void factorization(){
    int n;
    while(1){
        printf("Input: ");
        scanf("%d",&n);
 
        if(n<2) return;
        int p=2;
        int primes[20];
        int index=0;
        int i;
 
        while(n!=1){
            if(n%p==0){
                n=n/p;
                primes[index]=p;
                index++;
                p=2;
            }
            else{
                p++;
            }
        }
 
        if(index==1) printf("소수\n");
        else{
            for(i=0; i<index-1; i++){
                printf("%d*",primes[i]);
            }
            printf("%d\n",primes[i]);
        }
    }
}

int main(void){

   factorization();
   return 0;

}

코드의 결합도를 낮추고 응집도를 높이기 위해 main() 함수에서는 factorization() 함수를 호출만 하도록 하였다. factorization() 함수에서는 일단 처리할 숫자 n을 정수형으로 선언하고 무한루프안에서 scanf 를 통해 사용자로부터 입력받는다. n이 2보다 작으면 함수를 종료시키고 그게 아니면 필요한 변수들을 선언하기 시작한다. 우선 p는 2로 초기화되는데 이건 숫자 n을 나누어 떨어지게 하면 소인수분해의 결과 중 하나가 되는 후보의 역할이다. primes[20]은 소인수분해의 결과를 저장해두기 위한 정수형 배열이고 index는 primes배열에 인덱스 0부터 차곡차곡 소인수들을 넣기 위한 인덱스 변수이다. 그리고 출력에 사용할 반복용 변수 i 가 있다. 알고리즘은 n이 1이 될때까지 계속 루프를 돌리는데 n을 p로 나눈 나머지가 0이면 p는 소인수가 되므로 p를 primes[]의 적절한 위치에 넣고 index를 1 증가시킨다. 또한 n에는 n을 p로 나눈 값이 다시 할당된다. 그리고 p에 초기값 2를 다시 할당 한 다음 루프의 처음으로 돌아간다. n을 p로 나눈 나머지가 0이 아니면 p는 n의 소인수가 아니므로 p를 1 증가시킨 후 다시 루프의 처음으로 돌아간다. n이 1이 되면 완전히 나누어 떨어져 더이상 소인수를 찾을 수 없으므로 소인수분해 찾기는 종료된다. 이때 index가 1이라면 이건 0번 인덱스에 하나의 숫자만 들어갔다는 뜻이 되므로 그 수는 소수라고 할 수 있다. 따라서 소수라고 출력해주고 아니라면 for문에서 반복용 변수 i를 이용해 결과값을 하나씩 출력해준다. 이때 주의사항은 현재 index라는 값은 실제 유효한 값이 들어있는 마지막 인덱스보다 1 크다는 것이다. 따라서 primes[] 배열의 인덱스 index-1까지의 값을 출력해줘야 하는데 마지막 값을 출력한 이후에는 index-2 까지 (숫자)x 를 출력해주고 index-1은 그냥 숫자만 출력 후 줄바꿈해준다.


각주

참고자료



같이 보기

  검수요청.png검수요청.png 이 소인수분해 문서는 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.