0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다.
먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다.
그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
문제를 하나하나 뜯어서 살펴보자!
간단하다! cin을 이용하여 정수 N을 입력받는다.
N = N / 10 + N % 10 //❶
3. N의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙여 새로운 수를 만든다.
① N의 가장 오른쪽 자리 수
➡ 1의 자리 수이므로 %로 구할 수 있다.
N % 10
② 앞에서 구한 합의 가장 오른쪽 자리 수
➡ 합이 두 자리 수가 되면 가장 오른쪽 자리를 구해야 한다. 마찬가지로, %이용한다.
(N / 10 + N % 10) % 10 //앞에 구한 합의 오른쪽 수
③ 이 둘(①,②)을 이어 붙여 새로운 수를 만든다.
➡ 두 수를 더한다. 더할 때, 10의 자리 수에는 10을 곱한다. 10의 자리 수는 ①(N의 가장 오른쪽 자리 수)이다.
N = (N % 10) * 10 + (N / 10 + N % 10) % 10
// ① + ②
4. 2~3번 과정을 반복하고 새로운 수가 원래 수로 돌아오는 사이클의 수를 구한다.
➡ 몇 번 반복 하는지 모르니 while문을 사용한다.
➡ 반복을 수행할 때마다 1씩 더해지는 변수가 필요하다. 이 변수는 선언할 때 0으로 초기화해야 한다.
이때, 원래 수와 새로운 수가 같은지 비교를 해야 while문을 종료할 수 있다. 따라서 초기에 원래 수(N)을 다른 변수에 저장해둔다. 이 후, if문을 이용하여 같은지 확인 후, 반복문을 종료한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int input_N; //주어지는 N의 값
int i = 1; // 사이클의 길이
int NEW; // 새로 만들어지는 수
int a; //좌변의 우측 숫자
int b; // 좌변의 좌측 숫자
scanf("%d", &input_N); //input이 26인 경우
a = input_N / 10;// 좌변의 왼쪽 수 대입 식 2
b = input_N % 10; // 좌변의 오른쪽 수 대입 식 6
NEW = a + b; // 8
while (i) {
a = b;// b = 6
b = NEW % 10; //8
NEW = a + b; // 우변의 값 NEW =8 ,14 , 12 ,6
printf("i = %d\n", i);
++i;
if (input_N == (10 * a + b)) {
break;
}
}
return 0;
}