작성일 :

문제 링크

23813번 - 회전

설명

정수의 마지막 자리를 떼어 맨 앞에 붙이는 회전을 반복해 원래 수로 돌아올 때까지 나온 수들의 합을 구하는 문제입니다.


접근법

자리수 길이를 len이라 하면, 같은 회전을 len번 수행하면 원래 수로 돌아옵니다. 매 회전마다 현재 수를 더한 뒤, 마지막 자리 last를 떼어 last * 10^(len-1) + (cur / 10) 형태로 갱신합니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;

class Program {
  static void Main() {
    var n = long.Parse(Console.ReadLine()!);
    var len = n.ToString().Length;

    long pow10 = 1;
    for (var i = 1; i < len; i++) pow10 *= 10;

    long cur = n;
    long sum = 0;
    for (var i = 0; i < len; i++) {
      sum += cur;
      var last = cur % 10;
      cur = cur / 10 + last * pow10;
    }

    Console.WriteLine(sum);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  ll n; cin >> n;
  int len = to_string(n).size();

  ll pow10 = 1;
  for (int i = 1; i < len; i++) pow10 *= 10;

  ll cur = n;
  ll sum = 0;
  for (int i = 0; i < len; i++) {
    sum += cur;
    ll last = cur % 10;
    cur = cur / 10 + last * pow10;
  }

  cout << sum << "\n";

  return 0;
}