0720
세 자리 숫자 (100~999까지의 수) 중에서 각 자리를 세제곱 후 더해서 자신이 되는 수를 찾는 프로그램을 작성하시오.
ex)
371 -> 3의 세제곱 + 7의 세제곱 + 1의 세제곱 = 371
실행결과 :
1 narcissus: xxx
2 narcissus: xxx
소스
public class For_Test11 {
public static void main(String args[]) {
int cnt = 1;
for ( int i = 100; i <= 999; i++ ) {
int hund = ( i / 100 );
int ten = i - (hund*100);
ten = ( ten / 10 );
int one = i - ( ( hund*100 )+( ten*10 ) );
int cubic_hund = hund*hund*hund;
int cubic_ten = ten*ten*ten;
int cubic_one = one*one*one;
if ( ( cubic_hund+cubic_ten+cubic_one ) == i ) {
System.out.println( cnt+" narcissus: "+i );
cnt++;
}
}
}
}
소스 풀이
cnt
는 이 프로그램에서 찾는 수의 개수를 나타냅니다. 즉, 각 자리를 세 제곱한 뒤 더한 값이 자신이 되는 수의 개수를 나타냅니다.
i
는 100~999
사이의 수를 나타냅니다. for문
을 한 번 반복할 때마다 1씩 증가합니다.
hund(hundred)
는 100의 자리
를 나타냅니다. 100의 자리를 구하는 방법은 i
에서 100
을 나눈 몫
입니다.
ten
은 10의 자리
를 나타냅니다. 10의 자리를 구하는 방법은 i
에서 hund(100의 자리)
에 100
을 곱한 값을 빼고, 그 값에서 10
을 나눈 몫
입니다.
one
은 1의 자리
를 나타냅니다. 1의 자리를 구하는 방법은 i(세 자리 수
에서 (hund(100의 자리)*100) + (ten(10의 자리)*10)
를 뺍니다.ex) 371
371 / 100 = 3
100의 자리 : 3
3 * 100 = 300
371 - 300 = 71
71 / 10 = 7
10의 자리 = 7
7 * 10 = 70
371 - (300+70) = 1
1의 자리 = 1
cubic_hund
는 hund의 세 제곱
을 나타내는 변수입니다. cubic_hund
에 hund*hund*hund
의 값을 저장합니다.
cubic_tne
은 ten의 세 제곱
을 나타내는 변수입니다. cubic_ten
에 ten*ten*ten
의 값을 저장합니다.
cubic_one
은 one의 세 제곱
을 나타내는 변수입니다. cubic_one
에 one*one*one
의 값을 저장합니다.※ cubic은 무슨 뜻인가요?
- 세 제곱이라는 뜻입니다.
※ 왜 cubic_hund와 같은 변수를 따로 쓰나요? 그냥 hund*hund*hund로 나타내면 안 될까요?
- 세 제곱으로 나타내야 하는 횟수가 세 번인데다가 그 변수의 갯수도 세 개이기 때문에
쓸데없이 소스가 길어짐을 방지하고자 따로 변수를 두었습니다.
- 만약 각 자리의 세 제곱의 합이
i(기존의 수)
와 같다면 cnt+"narcissus: "+i
의 형식으로 출력해 1 narcissus: xxx
의 형태가 나오도록 합니다. 그리고 cnt++
을 해주어 앞의 숫자가 바뀔 수 있도록 합니다.
실행 결과
1 narcissus: 153
2 narcissus: 370
3 narcissus: 371
4 narcissus: 407