일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 구현
- 텍스트 관련 태그들
- 메일
- 취미생활
- 날씨
- 연결리스트
- Python
- 단계별로풀어보기
- 건전한
- 알고리즘
- 건전한 취미생활
- 원소 추가
- OSAM
- CSS
- A - B
- 백준
- C언어
- VOCALOID
- 학습생활
- PyQT5
- 원소 삭제
- HTML
- 텍스트 관련
- 독학
- 과제
- 프로젝트
- *Luna
- A×B
- GUI
- c++
- Today
- Total
언유상씨의 건전한 취미생활
[백준 알고리즘] 소수 찾기(1978번) C로풀기 본문
문제 이름 : 소수 찾기
문제 번호 : 1978
사용 언어 : C
문제 유형 : 완전 탐색
문제는 다음과 같다.
빈 배열을 만든 뒤 제시된 원소를 넣고 소수의 개수를 세면 된다.
이때 소수를 판별하는 방법으로는 두가지 방법을 같이 쓸 것이다.
1. 숫자가 2 또는 3인가?
2. 숫자 보다 작은 수들중 나눈 값의 나머지가 0인 수가 있는가?
2번 조건을 조금만 더 생각해보면 다음과 같은 결론에 도달할 수 있다.
소수가 아닌수는, 제곱근의 값을 중심으로 앞 뒤에 나누는 수가 존재한다는 것.
예를 들어보면 다음과 같다.
36 의 약수 - 1 2 3 4 6 9 12 18 36
제곱근인 6을 전후의 값을 곱한다는 것을 알 수 있다.
따라서 1부터 제곱근 값 사이에서 원래 수를 나눌 수 있는 수가 없다면, 그 수는 소수이다.
코드는 다음과 같다
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h> // sqrt함수를 사용하기 위해
int main(){
int yu1[100], num;
int cnt = 0;
scanf("%d", &num);
for (int i = 0; i < num; i++) // 배열에 값 집어넣기
scanf("%d", &yu1[i]);
for (int i = 0; i < num; i++) { // 배열의 넣은 값들을 돌아보며 소수 판별중
if (yu1[i] == 2) // 2는 소수이므로
cnt++;
else if (yu1[i] == 3) // 3역시 소수이므로
cnt++;
for (int k = 2; k <= sqrt(yu1[i]); k++) { // 제곱근 까지의 수들 확인
if (yu1[i] % k == 0) // 나눠지면
break;
else if (k + 1 > sqrt(yu1[i])) // 나눠지지 않고 끝까지 도달했다면
cnt++;
}
}
printf("%d", cnt);
return 0;
}
'건전한 취미생활 - 알고리즘' 카테고리의 다른 글
[연결리스트] 원소의 삭제와 추가 - 소스 코드 (0) | 2020.05.11 |
---|---|
[연결리스트] 원소의 삭제와 추가 (1) | 2020.05.11 |
[백준 알고리즘] 홀수(2576번) C로풀기 (0) | 2020.02.07 |
[백준 알고리즘] 더하기 사이클(1110번) C로풀기 (0) | 2020.02.06 |
[백준 알고리즘] 저항(1076번) C로풀기 (0) | 2020.02.05 |