Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 두 구간 사이의 암스트롱 수(Armstrong Number) 출력하기

암스트롱 수(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() 함수 대신 직접 곱셈을 반복하는 방식을 사용하면 부동소수점 오차를 피할 수 있어 더 안전한 구현이 가능합니다.