일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 이분그래프
- 오블완
- 무소의뿔
- 윤파고
- 2023채용박람회
- 집착형
- 이런 사람에게 "절대" 돈과 시간 쓰지 마세요. (이헌주 교수 3부)
- wxmaxima
- 쌍대성원리
- 아이엔이야기
- 맥북에서 wxMaxima 설치
- 배윤슬
- 나르시스트
- 티스토리챌린지
- 합의정리
- 청년도배사 이야기
- 등록금0원
- playground배열
- wxMaxima install for mac os
- 다자녀장학금
- kgol
- 숫타니파아타
- 허스켈그래프
- 직선의방정식
- 정보처리기사공부방법
- 최단경로문제
- 제거된값 첨부하기
- 데이터베이스시스템
- 오일러투어
- 그래프2
- Today
- Total
사적공간
소인수 구하기 본문
소인수는 어떤 수의 약수 중에서 소수인 수를 말함.
ex) 12의 약수는 1,2,3,4,6,12가 있음. 이중 소수는 2와 3이 있음.
약수는 어떤수가 피제수일 때, 어떤 수를 나누어 떨어지게 만드는 제수를 말함
소수는 1과 자기 자신 만으로 나누어 떨어지는 수를 말함.
소인수는 약수 중 소수인 수를 말함.
cf) 인수는 어떤수를 곱 형태로 '인수 x 인수'로 나타낼 수 있음.
1) 생각해보면 어떤 수의 '인수x인수'에서 앞서 두 인수가 동시에 어떤 수의 제곱근을 초과할 수 없음.
ex) 36 의 제곱근은 6이고, 6 x 6 형태로 인수로 나타낼 수 있고, 3 x 12 로 나타내거나 1 x 36 이 되어 버리면 한쪽의 인수가 제곱근을 초과해 버리게 됨. 위 1)을 위배하게 됨.
어차피 소인수는 1과 자기 자신을 제외한 약수 중에서도 그러니까 {2부터 ~ 자기 자신의 제곱근 이하의 수} 의 범위에서만 존재할 수 있음.
아래 e는 제곱근에서 소수점 이하의 수를 버리고, 정수의 값만을 취해서 ..
#include<stdio.h>
#include<math.h>
int main() {
int b, c, d, e, mok, nmg;
int a[100];
scanf("%d", &b);
c = -1;
d = 2;
while(1) {
e = (int)sqrt(b);
while(1){
if(d>e) {
d = b; break;
}
mok = b/d;
nmg = b -mok*d;
if(nmg == 0)
break;
else
d++;
}
c++;
a[c] = d;
if (b == d)
break;
b = mok;
}
for(int i = 0; i <=c; i++)
printf("%d ", a[i]);
}
20
2 2 5
풀이
몫을 계속 나누어서 제수로 소인수를 구하는 방식임.
1) 소인수를 구할 수를 입력받고, 그 수를 나눌 피제수를 2부터 '정수화(소수인수를 구할 값의 제곱근)' 까지 증가시켜서 나누어 0으로 떨어지면, 그 수를 소인수 배열에 저장함.
2) 몫을 피제수로 저장해서 다시 나누어 위의 작업을 반복하는데, 0으로 나누어 떨어지지 않으면, 제수를 1 증가시켜서 반복함.
ex)
20/2 = 10 ( 0으로 나누어 떨어져서 제수가 소인수)
10/2 = 5 (0으로 나누어 떨어져서 제수가 소인수)
5/2 =! 0 이라서 2를 1씩 증가시켜(d++) '정수화(소수인수를 구할 값의 제곱근)' 보다 커져서 피제수 5 자체가 소인수
https://mathbang.net/200#gsc.tab=0
순서대로 설명
- 20을 넣는다.
- 2의 제곱근은 4.xxx, 정수값은 4
- 2> 4 는 거짓이다.
- mok = 10,
- nmg = 0
- c를 1 증가시켜 a[0] = 2 저장
- 20 =! 2 이므로, b 에 몫 10을 저장 후 반복하기 위해 위로 올라감
- 피제수는 10이므로 루트 10의 정수화는 e= 3
- 2 > 3 은 거짓임.
- 10 > 2 = 5, mok = 5
- 10 -2*5 = 0, nmg = 0
- 반복문을 빠져나와 c를 1 증가시키고, a[1] = 2 저장
- 5 =! 2 이므로 mok 5를 b 에 저장 후 위로 올라감
- 피제수는 5 이므로 루트 5의 정수화는 e = 2
- 2 > 2 는 거짓이므로
- 5/2 로 mok는 2
- nmg = 1
- nmg =! 0 이므로 d++ 로 1을 증가시키고 반복문으로 위로 올라감
- 3 > 2 이므로 if 조건문은 참 . b가 5인데, d = b를 넣고 안쪽 반복문 빠져나감.
- c를 1 증가시키고, a[2]에 5 저장
- b 가 5, d가 5 이므로 조건문이 참이므로 바깥쪽 반복문 빠져나감
- a[0]~ a[2]까지 차례로 출력
'자격증 > 정보처리기사_실기' 카테고리의 다른 글
[작성 중] 소수점이 있는 2진수를 10진수로 변환 (0) | 2024.04.08 |
---|---|
진법 변환하기 (10진수 -> 2 진수) (0) | 2024.04.08 |
약수 구하기 (0) | 2024.04.03 |
최대공약수와 최소공배수 구하기 (1) | 2024.03.29 |
소수의 합 (2) | 2024.03.29 |