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