본문 바로가기
PROGRAMMING CODE/C

[SOLUTION] 회문 정수 판별

by daye_ 2021. 10. 18.

[문제] 어떤 수를 입력 받아서 그 수를 뒤집은 다음 뒤집어진 수를 원래의 수에 더하는 과정을 뒤집어서 더하기 라고 부르자.

그 합이 회문(앞뒤 어느 쪽에서 읽어도 같은 말이 되는 어구 ex: eye, madam, 소주만병만주소)이 아니면 회문이 될 때까지 이 과정을 반복한다.

예를 들어 처음에 195에서 시작해서 다음과 같이 네 번 뒤집어서 더하기를 반복하면 9339라는 회문이 만들어진다.

대부분의 정수는 이 방법을 몇 단계만 반복하면 회문이 된다. 하지만 예외도 있다.

회문을 찾을 수 없는 것으로 밝혀진 첫 번째 수는 196이다. 하지만 회문이 없다는 것이 증명된 적은 없다.

어떤 수가 주어졌을 때 회문이 있으면 출력하고, 그 회문을 찾기까지 뒤집어서 더하기를 반복한 횟수를 출력하는 프로그램을 작성하시오.

테스트 데이터로 쓰이는 수는 모두 뒤집어서 더하기를 1,000번 미만 반복해서 회문을 찾을 수 있는 수이고,

그렇게 만들어진 회문은 4,294,967,295보다 크지 않다고 가정한다.

# 출력 예시1

please enter a number : 195

4 9339 //반복횟수는 4, 찾아진 회문의 수는 9339

# 출력 예시2

please enter a number : 265

5 45254 // 반복횟수 5, 찾아진 회문의 수45254

# 출력 예시3

please enter a number : 750

3 6666 // 반복횟수는 3 , 찾아진 회문의 수는 6666

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)

int checkNum(int num);
int numChange(int num);

int main() {
	int check = 0, num = 0, swapNum = 0, cycle = 0;
		printf("Please enter a number : ");
		scanf("%d", &num);
		for (;;) {
			cycle++;
			swapNum = numChange(num);
			num += swapNum;
			if (checkNum(num) == 1) break;
		}
		printf("%d %d\n\n", cycle, num);
	return 0;
}
int checkNum(int num) {
	int length, i, flag = 0;
	char text[30];
	itoa(num, text, 10);
	length = strlen(text);
	for (i = 0; i < length / 2; i++)
	{
		if (text[i] != text[length - 1 - i])
		{
			flag = 1;
			break;
		}
	}
	if (flag == 0) return 1;
	else return 0;
}
int numChange(int num) {
	int r = 0;
	while (num) {
		r = (r * 10) + (num % 10);
		num = num / 10;
	}
	return r;
}