Kaprekar Number

问题描述

定义函数 g1(x),g2(x),f(x),x>0g_1(x),g_2(x),f(x),x>0 如下:

  • g1(x)=g_1(x)=xx 的各位数字按照降序排序
  • g2(x)=g_2(x)=xx 的各位数字按照升序排序,忽略前导零
  • f(x)=g1(x)g2(x)f(x)=g_1(x)−g_2(x)

例如,g1(318)=831g_1(318)=831, g2(1024)=124g_2(1024)=124, f(271)=721127=594f(271)=721−127=594

给出整数 N,KN,K, 定义数列 a0=N,ai+1=f(ai)(i0)a_0=N, a_{i+1}=f(a_i) (i≥0),求 aKa_K.

输入格式

输入一行包含两个整数 N,K;N109,K105N,K;N\le 10^9,K\le 10^5

输出格式

输出一个整数表示 aKa_K

样例输入1

1024 2

样例输出1

8172

样例输入2

10 3

样例输出2

0
#include <bits/stdc++.h>
using namespace std;

int g1(int n) {
    vector<int> v;
    while (n > 0) {
        v.push_back(n % 10);
        n /= 10;
    }
    sort(v.begin(), v.end(), greater<int>());
    int ans = 0;
    for (auto i : v) {
        ans = ans * 10 + i;
    }
    return ans;
}

int g2(int n) {
    vector<int> v;
    while (n > 0) {
        v.push_back(n % 10);
        n /= 10;
    }
    sort(v.begin(), v.end());
    int ans = 0;
    for (auto i : v) {
        ans = ans * 10 + i;
    }
    return ans;
}

int f(int n) {
    return g1(n) - g2(n);
}

int main() {
    int n, k;
    cin >> n >> k;
    for (int i = 0; i < k; i++) {
        n = f(n);
    }
    cout << n << endl;
    return 0;
}