[문제] 어떤 수를 입력 받아서 그 수를 뒤집은 다음 뒤집어진 수를 원래의 수에 더하는 과정을 뒤집어서 더하기 라고 부르자.
그 합이 회문(앞뒤 어느 쪽에서 읽어도 같은 말이 되는 어구 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;
}
'PROGRAMMING CODE > C' 카테고리의 다른 글
[SOLUTION] 2차원 배열 하나로 학생들의 점수(난수 이용), 평균 구하기 (0) | 2021.10.18 |
---|---|
[SOLUTION] 흐르는 물 (0) | 2021.10.18 |
[SOLUTION] 완전수 판별 (0) | 2021.10.18 |
[SOLUTION] 행렬의 덧셈 뺄셈 (0) | 2021.10.18 |
[BAEKJOON] No.14681 C언어 (0) | 2021.10.18 |