공룡호가 사는 세상 이야기

UVA - 10018
programming-challenges - 110502


Reverse And Add는 어떤수를 입력 받았을 때 이것을 뒤집어서 원래의 수에 더하는 과정이다.
이 과정을 반복하다가 결과가 Palindrome(앞뒤 어느쪽으로 보아도 같은 말이 되는 어구 ex : eye ,madam)이 될 때까지 반복한다.

이 Palindrome을 찾기까지의 Reverse and Add 횟수와 찾아진 Palindrome을 출력하는 프로그램을 만들어 보자.

195 + 591 = 786
786 + 687 = 1473
1473 + 3743 = 5214
5214 + 4125 = 9339

입력
그 아래부터 테스트 하려는 정수 N

출력
주어진 N에 대한 Reverse and Add횟수와 찾아진 Palindrome을 공백을 두고 출력한다.

입력 예제
195
265
750

출력 예제
4 9339
5 45254
3 6666

Explanation :
숫자를 뒤집어서 비교하면서 더해주기만 하면 되는 문제이다.
숫자를 뒤집는 방법은 여러가지가 있다. string으로 변환하여 뒤집어서 비교하는 방법, 수학적 연산으로 수를 뒤집는 방법 등이 있다.
2가지 방법으로 해결한 소스는 아래에 첨부.

1st - 숫자뒤집기

#include <stdio.h>

int process(int n)
{
int result = 0;

while(n) //입력수가 0이 아닌동안
{
result = (result * 10) + (n % 10); //결과를 10배하고 단위값 추가
n /= 10; //입력수 단위를 밀어낸다
}

return result;
}

void main(void)
{
int n, rev;
int cnt = 0;
scanf("%d", &n);

while(1)
{
rev = process(n); //뒤집기

if (n == rev) //팰린드롬 유/무 판단
{
printf("%d ", cnt);
printf("%d\n", n);
break;
}
n = n + rev; //뒤집은 값 더하기
cnt++; //reverse and add 횟수 증가
}
}


2st - 뒤집지 않고 검사 (By Won.suck)

#include <windows.h>
#include <stdio.h>
#include <sys/timeb.h>

bool isCondition( char *pNum, int length )
{
for( int i=0; i<length/2; ++i )
if( pNum[i] != pNum[length-i-1] )
return FALSE;
return TRUE;
}

void func( int input )
{
printf( "func %d\n", input );

char temp[32];
int length;
itoa( input, temp, 10 );
length = strlen( temp );

if( isCondition( temp, length ) )
printf( "Result : %s\n", temp );
else
{
int newNum = 0;
for( int i=0; i<length; ++i )
newNum = newNum*10 + (temp[i]-'0' + temp[length-i-1]-'0');
func( newNum );
}
}

void main()
{
func(195);
}

'프로그래밍' 카테고리의 다른 글

strcmp() 함수  (0) 2006.01.19
칼로리 계산(Back Tracking)  (2) 2006.01.18
ACM 10127 ONES  (0) 2006.01.16
GetTickCount() Function  (1) 2006.01.16
chaos in FOR loop  (0) 2006.01.13