while 연습문제
연습문제: 암스트롱 숫자 판단하기
숫자의 자릿수의 세제곱의 합이 숫자 자체와 같을 때의 숫자를 암스트롱 수라고 합니다. 세자리 수를 입력받아 암스트롱 숫자이면 yes를 출력하고 그렇지 않으면 no를 출력하는 프로그램을 작성하세요.
예를 들어 다음 세자리 숫자들은 모두 암스트롱 숫자입니다.
- 153 = (1 * 1 * 1) + (5 * 5 * 5) + (3 * 3 * 3)
- 371 = (3 * 3 * 3) + (7 * 7 * 7) + (1 * 1 * 1)
- 407 = (4 * 4 * 4) + (0 * 0 * 0) + (7 * 7 * 7)
먼저 입력 숫자의 자릿수를 계산한 다음, 각 자릿수만큼 거듭제곱한 값의 합을 계산합니다. 이 합계가 입력 숫자와 같은 숫자는 암스트롱 숫자입니다.
참고로, 네자리 숫자의 암스트롱 숫자는 8208이 있습니다.
- 8208 = (8 * 8 * 8 * 8) + (2 * 2 * 2 * 2) + (0 * 0 * 0 * 0) + (8 * 8 * 8 * 8)
테스트 케이스 예제
표준 입력:
153
표준 출력:
yes
테스트 케이스 예제
표준 입력:
555
표준 출력:
no
코드: judge_while_.c
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main(void)
{
int digits = 0; // 표준 입력으로 입력 받은 수를 저장
int armstrong = 0; // 암스트롱 수인지를 확인하기 위해 처음 입력 받은 수를 저장
int sum = 0; // 각 자리의 세제곱의 합계를 저장
int rem = 0; // 각 자리의 수를 임시 보관
scanf("%d", &digits);
// 변수 digits의 값은 while 루프에서 변경되므로 프로그램 끝에서 결과를 비교하기 위해 다른 변수에 임시 저장
armstrong = digits;
// 모든 숫자의 각 자릿수의 세제곱을 변수 sum에 저장
while (digits != 0)
{
rem = digits % 10; // 마지막 자리 수 가져오기
sum = sum + (rem * rem * rem); // sum 변수에 각 자릿수의 세제곱을 더함
digits = digits / 10; // 자릿수 변경: while 반복문을 반복하면서 1의 자리를 하나씩 지우기
}
// 모든 숫자의 세제곱의 합이 숫자 자체와 같은 숫자는 암스트롱 수
if (armstrong == sum)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
결과
테스트 케이스 예제
표준 입력:
123
표준 출력:
no
테스트 케이스 예제
표준 입력:
370
표준 출력:
yes
테스트 케이스 예제
표준 입력:
999
표준 출력:
no
해설
digits
변수로 153 값을 입력받는다면, 1의 자리부터 3, 5, 1을 분리해야 합니다.
while 반복문을 사용하여 반복하면서 digits % 10
코드를 사용하여 digits 변수에서 마지막 자리 숫자를 하나씩 뽑아낼 수 있습니다.
예를들어, 처음 rem = digits % 10
코드를 실행하면, 153에서 3이 반환됩니다.
암스트롱 숫자인지를 판단하기 위해서 나머지 값으로 반환된 3을 세제곱한 (3 * 3 * 3)의 값을 sum 변수에 더합니다.
그 다음 자릿수로 이동하기 위해서는 digits = digits / 10
코드를 실행합니다.
153 / 10을 하면 1의 자릿수가 없어지고 15가 반환됩니다.
동일한 절차로 while 반복문에서 15에서 1의 자릿수인 5를 구하고 5를 세제곱한 (5 * 5 * 5)의 결괏값을 sum 변수에 더하고 15 / 10을 실행하여 1을 구합니다.
최종적으로 1을 세제곱한 (1 * 1 * 1)의 결괏값을 sum 변수에 누적하고, 1 / 10을 실행하여 digits 변수가 0이 되어 while 반복문을 빠져나옵니다.