#SY0404. 数字黑洞
数字黑洞
数字黑洞
2026 信息素养大赛复赛模拟卷(小学组 C++)拓展题 改编自 B3866 [GESP202309 二级] 数字黑洞
题目背景
经典的"数字黑洞"问题是这样的:给定一个各位不全相同的三位数,把它的三个数字重新排列得到最大数与最小数,用最大数减最小数得到一个新数,重复这个过程,最终一定会"掉进黑洞"——停在 上再也出不来。
例如 :最大数 ,最小数 ,差 ;再变换 :;再变换 :;再变换 :。此后无论再变换多少次,都停在 。
整个过程中,出现了 个不同的数:,所以这个黑洞中包含了 个不同的数字。
那么,如果数字的位数更多呢?有些数字的变换会在若干个数之间周而复始地兜圈子,而不再停在某一个固定的数上。但无论怎样,变换过程中不会无限制地产生新数,在某个时刻一定会出现一个之前已经出现过的数——从此进入循环。
我们把变换过程中出现的所有不同的数,称为这个数字"黑洞中"的数。
你的任务,是求出给定的数字在变换过程中一共出现了多少个不同的数(包括这个数字本身,以及之后变换出来的所有数,直到某个数重复出现为止)。
题目描述
给定一个 位数 (可能含前导零,各位也可能有相同的)。定义一次"黑洞变换"如下:
- 把这 个数字重新排列,组成能得到的最大数和最小数(排列后若出现前导零,按数值计算即可)。
- 用最大数减去最小数,得到差。
- 如果差不足 位,就在前面补 ,使它始终保持 位,作为新的数继续变换。
从 出发不断重复变换,直到某个数重复出现为止。请你求出这个过程中一共出现了多少个不同的数。
输入格式
输入一行,包含一个 位数 (保留前导零,即字符串长度就是 )。
输出格式
输出一行,一个整数,表示变换过程中出现的不同数字的个数。
输入输出样例 #1
输入 #1
352
输出 #1
5
说明 #1
变换序列为 $352 \to 297 \to 693 \to 594 \to 495 \to 495 \to \cdots$。不同数字共 个:。
输入输出样例 #2
输入 #2
54321
输出 #2
6
说明 #2
变换序列为 $54321 \to 41976 \to 82962 \to 75933 \to 63954 \to 61974 \to 82962 \to \cdots$。不同数字共 个:。
数据范围与约定
对于全部数据,, 为长度恰好为 的数字串(允许前导零)。
本题采用子任务计分,各子任务分值如下:
| 子任务 | 分值 | 约束 |
|---|---|---|
| 1 | ,且保证各位互不相同(即经典黑洞问题) | |
| 2 | ,可能有相同数位或前导零 | |
| 3 | (变换最终会停在 ) | |
| 4 | ,变换过程可能进入循环而非停在单一数 | |
| 5 |