#SY0404. 数字黑洞

数字黑洞

数字黑洞

2026 信息素养大赛复赛模拟卷(小学组 C++)拓展题 改编自 B3866 [GESP202309 二级] 数字黑洞

题目背景

经典的"数字黑洞"问题是这样的:给定一个各位不全相同的三位数,把它的三个数字重新排列得到最大数与最小数,用最大数减最小数得到一个新数,重复这个过程,最终一定会"掉进黑洞"——停在 495495 上再也出不来。

例如 352352:最大数 532532,最小数 235235,差 297297;再变换 297297972279=693972-279=693;再变换 693693963369=594963-369=594;再变换 594594954459=495954-459=495。此后无论再变换多少次,都停在 495495

整个过程中,出现了 55 个不同的数:{352,297,693,594,495}\{352, 297, 693, 594, 495\},所以这个黑洞中包含了 55 个不同的数字。

那么,如果数字的位数更多呢?有些数字的变换会在若干个数之间周而复始地兜圈子,而不再停在某一个固定的数上。但无论怎样,变换过程中不会无限制地产生新数,在某个时刻一定会出现一个之前已经出现过的数——从此进入循环。

我们把变换过程中出现的所有不同的数,称为这个数字"黑洞中"的数。

你的任务,是求出给定的数字在变换过程中一共出现了多少个不同的数(包括这个数字本身,以及之后变换出来的所有数,直到某个数重复出现为止)。

题目描述

给定一个 nn 位数 NN(可能含前导零,各位也可能有相同的)。定义一次"黑洞变换"如下:

  1. 把这 nn 个数字重新排列,组成能得到的最大数最小数(排列后若出现前导零,按数值计算即可)。
  2. 用最大数减去最小数,得到差。
  3. 如果差不足 nn 位,就在前面补 00,使它始终保持 nn 位,作为新的数继续变换。

NN 出发不断重复变换,直到某个数重复出现为止。请你求出这个过程中一共出现了多少个不同的数

输入格式

输入一行,包含一个 nn 位数 NN(保留前导零,即字符串长度就是 nn)。

输出格式

输出一行,一个整数,表示变换过程中出现的不同数字的个数。

输入输出样例 #1

输入 #1

352

输出 #1

5

说明 #1

变换序列为 $352 \to 297 \to 693 \to 594 \to 495 \to 495 \to \cdots$。不同数字共 55 个:{352,297,693,594,495}\{352, 297, 693, 594, 495\}

输入输出样例 #2

输入 #2

54321

输出 #2

6

说明 #2

变换序列为 $54321 \to 41976 \to 82962 \to 75933 \to 63954 \to 61974 \to 82962 \to \cdots$。不同数字共 66 个:{54321,41976,82962,75933,63954,61974}\{54321, 41976, 82962, 75933, 63954, 61974\}

数据范围与约定

对于全部数据,2n62 \le n \le 6NN 为长度恰好为 nn 的数字串(允许前导零)。

本题采用子任务计分,各子任务分值如下:

子任务 分值 约束
1 2020 n=3n = 3,且保证各位互不相同(即经典黑洞问题)
2 n=3n = 3,可能有相同数位或前导零
3 n=4n = 4(变换最终会停在 61746174
4 n5n \le 5,变换过程可能进入循环而非停在单一数
5 n6n \le 6