암스트롱 수(Armstrong Number)는 각 자릿수를 숫자의 전체 자릿수만큼 거듭제곱한 값들의 합이 원래 수와 같아지는 수를 말합니다.
암스트롱 수의 대표적인 예시는 다음과 같습니다.
3 = 3^1 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 407 = 4^3 + 0^3 + 7^3 = 64 + 0 + 343 = 407 1634 = 1^4 + 6^4 + 3^4 + 4^4 = 1 + 1296 + 81 + 256 = 1634
위 예시에서 볼 수 있듯이, 세 자리 수 153은 각 자릿수를 세제곱하여 더하면 다시 153이 되고, 네 자리 수 1634는 각 자릿수를 네제곱하여 더하면 1634가 됩니다.
C++ 전체 코드
다음은 두 구간 사이에 존재하는 모든 암스트롱 수를 찾아 출력하는 C++ 프로그램입니다.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int lowerbound, upperbound, digitSum, temp, remainderNum, digitNum ;
lowerbound = 100;
upperbound = 500;
cout<<"Armstrong Numbers between "<<lowerbound<<" and "<<upperbound<<" are: ";
for(int num = lowerbound; num <= upperbound; num++) {
temp = num;
digitNum = 0;
while (temp != 0) {
digitNum++;
temp = temp/10;
}
temp = num;
digitSum = 0;
while (temp != 0) {
remainderNum = temp%10;
digitSum = digitSum + pow(remainderNum, digitNum);
temp = temp/10;
}
if (num == digitSum)
cout<<num<<" ";
}
return 0;
}실행 결과
Armstrong Numbers between 100 and 500 are: 153 370 371 407
코드 동작 원리
위 프로그램은 여러 단계를 거쳐 주어진 구간 내의 암스트롱 수를 찾습니다. 먼저 구간의 하한(lowerbound)과 상한(upperbound)을 지정하고, 이 값을 기준으로 for 루프를 시작합니다. 그런 다음 구간 내의 각 숫자를 하나씩 검사하여 해당 숫자가 암스트롱 수인지 판별합니다.
이 과정은 아래 코드 조각에서 확인할 수 있습니다.
lowerbound = 100; upperbound = 500; cout<<"Armstrong Numbers between "<<lowerbound<<" and "<<upperbound<<" are: "; for(int num = lowerbound; num <= upperbound; num++)
1단계: 자릿수 계산하기
for 루프 안에서 가장 먼저 하는 일은 현재 숫자(num)가 몇 자리 수인지 구하는 것입니다. 숫자를 10으로 나누면서 자릿수 변수(digitNum)를 하나씩 증가시키면 자릿수를 셀 수 있습니다.
temp = num;
digitNum = 0;
while (temp != 0) {
digitNum++;
temp = temp/10;
}2단계: 자릿수 거듭제곱의 합 구하기
자릿수를 파악한 후에는 각 자릿수를 자릿수 개수(digitNum)만큼 거듭제곱한 값을 모두 더하여 digitSum을 계산합니다. 나머지 연산자(%)를 사용해 마지막 자릿수를 하나씩 추출하는 방식입니다.
temp = num;
digitSum = 0;
while (temp != 0) {
remainderNum = temp%10;
digitSum = digitSum + pow(remainderNum, digitNum);
temp = temp/10;
}3단계: 암스트롱 수 판별 및 출력
마지막으로 원래 숫자와 계산된 digitSum을 비교합니다. 두 값이 같다면 그 숫자는 암스트롱 수이므로 화면에 출력하고, 같지 않다면 암스트롱 수가 아니므로 건너뜁니다.
if (num == digitSum) cout<<num<<" ";
이 프로그램의 시간 복잡도는 구간의 크기에 비례하며, 각 숫자에 대해 자릿수만큼 반복 연산을 수행하므로 O(n × d)입니다(n은 구간 크기, d는 평균 자릿수). 또한 pow() 함수 대신 직접 곱셈을 반복하는 방식을 사용하면 부동소수점 오차를 피할 수 있어 더 안전한 구현이 가능합니다.