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

C 언어 while 루프로 회문(Palindrome) 숫자 판별하기

회문(Palindrome) 숫자란?

회문 숫자는 숫자의 자릿수를 거꾸로 뒤집어도 원래 값과 동일하게 유지되는 수를 말합니다. 대표적인 예로 121, 1331, 12321 등이 있으며, 1221을 뒤집어도 그대로 1221이므로 회문 숫자에 해당합니다.

C 언어에서는 while 루프를 활용하면 사용자가 입력한 양의 정수가 회문 숫자인지 아닌지 손쉽게 판별할 수 있습니다. 핵심 원리는 숫자를 한 자리씩 분리한 뒤 역순으로 조립하고, 그 결과를 원래 숫자와 비교하는 것입니다.

예제 1: while 루프로 숫자 회문 판별하기

다음은 while 루프를 사용하여 회문 숫자를 찾는 C 프로그램입니다.

#include <stdio.h>
int main(){
    int num, temp, rem, rev = 0;
    printf("enter a number:\n");
    scanf("%d", &num);
    temp = num;
    while ( temp > 0){
        rem = temp %10;
        rev = rev *10+ rem;
        temp = temp /10;
    }
    printf("reversed number is = %d\n", rev);
    if ( num == rev )
        printf("\n%d is Palindrome Number.\n", num);
    else
        printf("%d is not the Palindrome Number.\n", num);
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

enter a number:
1234
reversed number is = 4321
1234 is not the Palindrome Number.
enter a number:
1221
reversed number is = 1221
1221 is Palindrome Number.

동작 원리 살펴보기

  • rem = temp % 10; — 나머지 연산자(%)를 이용해 현재 숫자의 마지막 자릿수를 추출합니다.
  • rev = rev * 10 + rem; — 기존에 만든 역순 숫자를 한 자리 왼쪽으로 밀고 새 자릿수를 덧붙여 뒤집힌 숫자를 완성합니다.
  • temp = temp / 10; — 정수 나눗셈으로 마지막 자릿수를 제거하며, temp가 0이 되면 루프가 종료됩니다.

루프가 끝난 후 num == rev 조건으로 원래 숫자와 뒤집힌 숫자를 비교하여 회문 여부를 최종 판정합니다.

예제 2: while 루프로 문자열 회문 판별하기

while 루프는 숫자뿐만 아니라 문자열에도 적용할 수 있습니다. 다음 예제에서는 문자열의 시작 인덱스(i)와 끝 인덱스(length)를 서로 마주 보게 이동시키면서 각 위치의 문자를 비교하는 방식으로 회문 여부를 검사합니다.

#include <stdio.h>
#include <string.h>
void pal(char string[]);
int main(){
    char string[100];
    printf("enter a string: ");
    gets(string);
    pal(string);
    return 0;
}
void pal(char string[]){
    int i = 0;
    int length = strlen(string) - 1;
    while (length > i){
        if(string[i++] != string[length--]){
            printf("\n %s is not a palindrome", string);
            return;
        }
    }
    printf("\n %s is a palindrome string", string);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

enter a string: tutorial
tutorial is not a palindrome
enter a string: saas
saas is a palindrome string

마무리

이처럼 while 루프 하나만으로도 숫자형 회문과 문자열 회문을 모두 판별할 수 있습니다. 숫자의 경우 나눗셈과 나머지 연산으로 자릿수를 조작하고, 문자열의 경우 양쪽 끝에서 중앙으로 인덱스를 이동시키며 비교한다는 점이 두 접근 방식의 핵심 차이입니다. 참고로 실무 코드에서는 버퍼 오버플로 위험이 있는 gets() 대신 fgets()scanf() 사용을 권장합니다.