항목 | 예시 |
---|---|
입력 예시 | A=5, B=19 |
출력 목표 | A이상 B이하 소수들의 합을 출력 |
반복 흐름 | A부터 B까지 순회하면서 소수 판별을 통해 true인것을 result에 더해나간다. |
조건 분해 | (1)A<=arr<=B(2)소수인것만 더하기 |
구현 계획 | 소수판별함수(2부터 n-1까지 나눴을때 안나눠지면 true),메인함수에서 더하기 |
[입출력 구조]
[핵심 조건]
소수를 판별해서 A이상 B이하 소수들의 합을 구해야함.
[반복 구조]
[예외 및 세부 조건]
1로는 다나눠지기 때문에 2부터 나눌것이다.
[예시 흐름]
A가 8 B가 98
i= 9->소수아님 x
i= 11->소수임 result에 더함
~i가 √98일때까지 반복
for (int i = A; i <= B; i++) {
if (isPrime(i)) result += i;
}
조건 | 이유 |
---|---|
n < 2 이면 소수 아님 | 소수의 정의상 2부터 시작 |
2는 소수 | 나눌 필요 없이 true 처리 |
2보다 큰 짝수는 소수 아님 | 2 외 모든 짝수는 2로 나눠짐 |
소수 판별은 i <= √n 까지만 검사 | 약수 쌍 중 작은 쪽이 √n 이하이므로 |
나눗셈은 n % i == 0 이면 false 반환 | 약수 존재 시 소수 아님 |
i = 8 → 소수 아님 (2로 나눠짐) → 스킵
i = 9 → 소수 아님 (3으로 나눠짐) → 스킵
i = 11 → 소수 (2,3에서 나눠지지 않음) → result += 11
...
i = 97 → 소수 → result += 97
i = 98 → 소수 아님 → 종료
→ 전체 시간복잡도: O((B - A + 1) × √B)
import java.util.Scanner;
public class Main {
public static boolean isPrimeNum(int num){
if(num<2){
return false;
}
if(num==2){
return true;
}
if(num%2==0){
return false;
}
for(int i=3;i<=Math.sqrt(num);i+=2){
if(num%i==0){
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int result=0;
for(int i=a;i<=b;i++){
if(isPrimeNum(i)){
result+=i;
}
}
System.out.print(result);
}
}