소수를 구별하고 범위 내의 소수를 출력하는 함수를 만들다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function getPrimeNumber(startNum, endNum) {
let count = 0;
let sosuList = [];
for (i = startNum; i <= endNum; i++) {
for (j = 1; j <= i; j++) {
if (i % j == 0) {
count += 1;
}
if (count > 2) {
count = 0;
break;
}
}
if (count == 2) {
sosuList.push(i);
count = 0;
}
}
return console.log(`${startNum} 부터 ${endNum}까지의 소수 ${sosuList}`)
}
function primeNumber(num) {
let count = 0;
for (i = 1; i <= num; i++) {
if (num % i == 0) {
count += 1
}
}
if (count == 2) {
console.log("소수입니다.")
}
else {
console.log("소수가 아닙니다.")
}
}
// 선생님 코드
let array = getPrimeNumber(startNum, endNum)
console.log(array)
function getPrimeNumber(sNum, eNum) {
let cnt = 0; //약수의 개수
let array = [];
for (let i = sNum; i <= eNum; i++) {
cnt=0;
for (let j = 1; j <= i; j++) {
if (i % j == 0) {
cnt++;
}
}
if (cnt == 2) {
array.push(i)
} else {
console.log("소수가아닙니다");
}
}
return array
}
getPrimeNumber(2, 30)
primeNumber(2)
</script>
</body>
</html>
1. 소수 판별 함수
function primeNumber(num) {
let count = 0;
for (i = 1; i <= num; i++) {
if (num % i == 0) {
count += 1
}
}
if (count == 2) {
console.log("소수입니다.")
}
else {
console.log("소수가 아닙니다.")
}
}
접근방식은 약수의 특징을 생각하면 된다. 약수의 특징은 1과 자기 자신으로만 나누어 떨어진다는 성격을 가지고 있다.
∵ 입력한 수 보다 작거나 같은 수들로 나누었을 때 나머지가 0인 횟수가 2번이면 이것은 소수이다라는 결론이 나온다.
일단 나누어 떨어지는 횟수를 체크할 count변수를 선언해 준다.
반복문의 의미는 자기 자신을 1부터 자기 자신을 포함한 범위 내의 모든 수를 나머지 연산자로 나누어주기 위함이다. 그 반복문 안에 나누어 떨어지는 횟수를 체크하는 조건문을 넣어준다.
반복문 외부에 if - else문으로 count가 2일 때만 소수이니까 count == 2면 "소수입니다"를 출력하고 아니면 "소수가 아닙니다"를 출력하게 해 준다.
2. 두 수를 입력받고 두 수를 포함한 범위 내의 소수를 모두 출력하는 함수
function getPrimeNumber(startNum, endNum) {
let count = 0;
let sosuList = [];
for (i = startNum; i <= endNum; i++) {
for (j = 1; j <= i; j++) {
if (i % j == 0) {
count += 1;
}
if (count > 2) {
count = 0;
break;
}
}
if (count == 2) {
sosuList.push(i);
count = 0;
}
}
return console.log(`${startNum} 부터 ${endNum}까지의 소수 ${sosuList}`)
}
1번과 같은 원리로 접근해 보겠다.
나누어 떨어지는 횟수를 세주는 count변수를 선언하고 소수인 수들을 보관할 배열(sosuList)도 선언해 준다.
외부 for문은 입력한 수를 차례대로 반복해 주는 반복문이다. 그래서 초기값이 startNum이고 점점 증가하니까 i++, 조건부의 끝이 endNum으로 풀어서 말하면 i는 startNum부터 endNum까지 1씩 증가한다.
내부 for문은 i가 소수인지 아닌지 검증하기 위해 1부터 i를 포함한 내의 수들을 모두 반복해 줄 반복문이다. 그렇다면 1부터 비교해야 하니 초기값은 1, 증가하니까 j++, 조건부는 i까지 비교해야 하니까 i보다 작거나 같다고 해주면 된다.
내부 for문안의 조건문은 앞에서 했다시피 나누어 떨어지면 count가 1 증가하고 count가 2보다 커지는 순간! 이 수는 소수가 아니니까 더 이상 볼 필요도 없으니 break;를 걸어주었다. break가 걸리면 바로 다음 i로 건너뛴다.
그리고 내가 이 문제에서 중요하다고 생각하는 부분인 count = 0을 넣어주는 이유이다. 이것을 안 넣어주면 다음 i로 건너뛰고 나서도 count의 값이 0부터 시작하지 않고 2보다 커진 상태로 시작하기 때문에 i가 수학적으로 소수여도 이 코드는 count가 이미 2보다 크기 때문에 인식하지 않고 넘겨버린다. 이 오류를 방지하기 위해서 count = 0을 넣어줌으로써 다음 i도 정상적인 소수 판별을 할 수 있게 된다
만약 count가 2로 내부 for문이 끝났다면 외부 for문 안에 있는 if문에 들어가서 count가 2니까 실행로직을 실행해서 처음에 소수를 보관하기 위해 만들었던 sosuList에 push로 넣어주면 된다.
'Front-End > 3. JavaScript 실전' 카테고리의 다른 글
[JS] Ex07_DOM.html (6 없음) (0) | 2023.06.19 |
---|---|
[JS] Ex05_객체실습.html (0) | 2023.06.19 |
[JS] Ex04_객체.html (0) | 2023.06.19 |
[JS] Ex03_햄버거실습.html (0) | 2023.06.19 |
[JS] Ex01_함수.html (0) | 2023.06.15 |