데믈로 수란 무엇인가?
데믈로 수(Demlo number)는 11…1처럼 모든 자릿수가 1로 이루어진 수(10자리 미만)를 제곱했을 때 얻어지는 회문수입니다. 예를 들어 1111² = 1234321처럼, 결과가 1부터 차례대로 커졌다가 다시 작아지는 완벽한 대칭 구조를 가집니다.
구현 아이디어
실제로 큰 수의 곱셈을 수행할 필요 없이, 문자열 조작만으로 결과를 손쉽게 만들 수 있습니다. 알고리즘은 다음 두 단계로 구성됩니다.
- 첫 번째 반복문에서 1부터 n까지 숫자를 차례대로 이어 붙입니다.
- 두 번째 반복문에서 n−1부터 1까지 역순으로 이어 붙여 대칭 구조를 완성합니다.
먼저 사용할 문자열 변수를 선언합니다.
string demNum = "1111";
string square = "";첫 번째 반복문은 demNum 문자열의 길이만큼 순회하며, 인덱스 값 i를 문자로 변환한 뒤 square 변수에 추가합니다.
for(int i = 1; i <= demNum.length(); i++){
square += char(i + '0');
}두 번째 반복문은 demNum 길이에서 1을 뺀 값부터 시작해 1까지 역방향으로 순회하며, 같은 방식으로 문자를 추가합니다.
for (int i = demNum.length() - 1; i >= 1; i--)
square += char(i + '0');전체 예제 코드
아래 전체 구현을 통해 데믈로 수 생성 과정을 더 잘 이해할 수 있습니다.
#include <iostream>
using namespace std;
int main(){
string demNum = "1111";
string square = "";
for(int i = 1; i <= demNum.length(); i++){
square += char(i + '0');
}
for (int i = demNum.length() - 1; i >= 1; i--)
square += char(i + '0');
cout << square;
return 0;
}실행 결과
위 코드를 실행하면 다음과 같은 출력이 나옵니다.
1234321
참고 사항
이 방법은 자릿수가 9 이하일 때만 유효합니다. 10자리 이상이 되면 올림(carry)이 발생해 단순한 대칭 패턴이 깨지기 때문입니다. 따라서 입력되는 1의 개수가 10개 미만일 때만 이 기법을 사용하는 것이 안전합니다.