문제 :
양의 정수 내에 있는 홀수 숫자들의 개수를 구하는 문제를 고려한다. 예를 들면, 12345에 있는 홀수 숫자들의 개수는 3이다. 0은 짝수다.
1. 주어진 양의 정수 내에 있는 홀수 숫자들의 개수를 반복을 사용하여 구하는 메소드를 작성하라.
2. 주어진 양의 정수 내에 있는 홀수 숫자들의 개수를 재귀를 사용하여 구하는 메소드를 작성하라.
힌트: 양의 정수 내에 있는 홀수 숫자들의 개수를 다음과 같이 구할 수 있다 :
(a) 양의 정수가 10보다 작다면 홀수 숫자들의 개수는 양의 정수를 2로 나눈 나머지가 1이면 1이고 아니면 0이다.
(b) 양의 정수가 10 이상이라면 홀수 숫자들의 개수는 다음과 같다:
1) 마지막 숫자를 2로 나눈 나머지가 1이라면 마지막 숫자를 제거한 나머지 정수 내의 홀수 숫자들의 개수에 1을 더한 값이다.
2) 마지막 숫자를 2로 나눈 나머지가 0이라면 마지막 숫자를 제거한 나머지 정수 내의 홀수 숫자들의 개수이다.
예를 들면, 102030에 있는 홀수 숫자들의 개수는 마지막 숫자인 0을 2로 나눈 나머지가 0이므로 10203에 있는 홀수 숫자들의 개수인 2이다.
3. 사용자로부터 하나의 양의 정수를 입력 받아 그 정수 내의 홀수 숫자들의 개수를 1번과 2번에서 작성한 메소드들을 이용하여 구한 후 출력하는 main 메소드를 작성하라. 다음은 모범 출력이다.
양의 정수를 입력하세요: 123456789
반복 결과: 5개
재귀 결과: 5개
문제 풀이 :
import java.util.Scanner;
//Number_of_Even 클래스
public class Number_of_Even {
//반복문을 사용하여 짝수 숫자들의 개수를 구하는 함수
public static int even_for(int n) {
int count = 0;//짝수 숫자들의 개수
for(int i = 1; i <= n; i++) {
if((n % 10) % 2 == 0) {
count++;//n의 맨 뒷자리의 수가 짝수라면 count를 +1 시켜준다
}
n /= 10;//n의 맨 뒷자리를 잘라낸다
}
return count;//짝수 숫자들의 개수 반환
}
//재귀를 사용하여 짝수 숫자들의 개수를 구하는 함수
public static int even_recursive(int n) {
// 한 자리 숫자인 경우 처리
if(n < 10) {
if(n % 2 == 0) {
return 1;//n이 짝수라면 +1
}
else {
return 0;//n이 홀수면 개수를 증가시키지 않는다
}
}
// 한 자리 숫자가 아닌 경우 처리
else {
if((n % 10) % 2 == 0) {
//n의 맨 뒷자리수가 짝수라면 개수를 1 증가시키고 맨 뒷자리수를 잘라낸다
return even_recursive(n / 10) + 1;
}
else {
//n의 맨 뒷자리수가 홀수라면 개수를 증가시키지 않고 맨 뒷자리수를 잘라낸다
return even_recursive(n / 10);
}
}
}
//main 함수
public static void main(String[] args) {
//변수 선언
int num;
int result;
//스캐너 객체 선언
Scanner scan = new Scanner(System.in);
//양의 정수를 입력받는다
System.out.print("양의 정수를 입력하세요: ");
num = scan.nextInt();
//입력받은 양의 정수를 even_for 함수에 넣고 결과를 result 변수에 집어넣는다
result = even_for(num);
//even_for 함수를 통해 얻은 결과를 출력한다
System.out.println("반복 결과: " + result + "개");
//입력받은 양의 정수를 even_recursive 함수에 넣고 결과를 result 변수에 집어넣는다
result = even_recursive(num);
//even_for 함수를 통해 얻은 결과를 출력한다
System.out.println("재귀 결과: " + result + "개");
//스캐너 객체를 닫아준다
scan.close();
}
}