洛谷 B3866 [GESP202309 二级] 数字黑洞: 思路 和 C++ 题解

洛谷 B3866 [GESP202309 二级] 数字黑洞

第 6 篇 CSDN!

洛谷 B3866 [GESP202309 二级] 数字黑洞

这个题很容易想到能用递归来做…

假设我们有这么一个函数 c n t ( n , a n s ) cnt(n,ans) cnt(n,ans) 表示处理函数 和答案变量 a n s = 0 ans=0 ans=0,那么程序先调用 c n t ( n , 0 ) cnt(n,0) cnt(n,0) (一开始的 a n s = 0 ans=0 ans=0 ),在 c n t cnt cnt 里判断 n n n 是否为 495 495 495,如果是,直接输出 a n s ans ans,然后退出程序。

否则,先让 a n s ans ans 加一,然后再调 c n t ( g − h , a n s ) cnt(g-h,ans) cnt(gh,ans), g g g 表示重排的最大值, h h h 表示重排的最小值。

那么, g g g h h h 该怎么得到?
首先,我们要对 n n n 的数位重排,必定会得到 n n n 各个数位上的数字,不妨用 a , b , c a,b,c a,b,c 表示他的个位,十位和百位。于是,重排后最大的三位数 g g g 100 a + 10 b + c 100a+10b+c 100a+10b+c ,最小的三位数 h h h 100 c + 10 b + a 100c+10b+a 100c+10b+a(假设 a ≥ b ≥ c a \ge b \ge c abc

所以,如何得到 a , b , c a,b,c a,b,c 的值呢?
其实,我们有一个通用的规律,即对于一个正整数 n n n,其从最低位到最高位的第 k k k 位(记为 n k n_k nk)数字为:
n k = ⌊ n 1 0 k − 1 ⌋   m o d   10 n_k=\lfloor \frac{n}{10^{k-1}}\rfloor\ mod\ 10 nk=10k1n mod 10

n = 123 , k = 2 n=123,k=2 n=123,k=2 n k = ⌊ 123 10 ⌋   m o d   10 n_k=\lfloor \frac{123}{10} \rfloor \ mod\ 10 nk=10123 mod 10,即 12   m o d   10 12\ mod\ 10 12 mod 10,最终结果为 2 2 2

根据这个规律,我们能得到: a = n   m o d   10 , b = ⌊ n 10   m o d   10 ⌋ a=n\ mod\ 10,b=\lfloor \frac{n}{10}\ mod\ 10 \rfloor a=n mod 10,b=10n mod 10, c = ⌊ n 100   m o d   10 ⌋ c=\lfloor \frac{n}{100}\ mod\ 10\rfloor c=100n mod 10

那么,如何判断 a , b , c a,b,c a,b,c 哪个最大,哪个第二大,哪个第三大?
在 C++ 中,有一个内置方法 m a x ( x , y ) max(x,y) max(x,y),能求得 x x x y y y 中的最大值,也有 m i n ( x , y ) min(x,y) min(x,y),能求得 x x x y y y 中的最小值。

于是,我们设 d d d a , b , c a,b,c a,b,c 中的最大值,则有:
d = m a x ( a , m a x ( b , c ) ) d=max(a,max(b,c)) d=max(a,max(b,c))
我们设 e e e a , b , c a,b,c a,b,c 中的次小值,则有:
e = m i n ( m a x ( a , b ) , c ) e=min(max(a,b),c) e=min(max(a,b),c)

我们设 f f f a , b , c a,b,c a,b,c 中的最小值,则有::
f = m i n ( m i n ( a , b ) , c ) f=min(min(a,b),c) f=min(min(a,b),c)

那么此时的 g ( 最大值 ) = 100 d + 10 e + f g(\text{最大值})=100d+10e+f g(最大值)=100d+10e+f, h ( 最小值 ) = 100 f + 10 e + d h(\text{最小值})=100f+10e+d h(最小值)=100f+10e+d

所以这次递归的参数 n n n g − h g-h gh,那么整个题的思路就顺完了!
这个题稍微推导一下还是能 AC 的…
所以,上代码!

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

int cnt(int n, int ans) {
	if (n == 495) {
		cout << ans;
		exit(0);
	}
	
	else {
		ans ++;
		int a = n % 10, b = n / 10 % 10, c = n / 100 % 10, d = max(a, max(b, c)), e = min(max(a, b), c), f = min(a, min(b, c)), g = d * 100 + e * 10 + f, h = f * 100 + e * 10 + d;
		cnt(g - h, ans);
	}
}

int main() {
	int n, ans = 0;
	cin >> n;
	
	cnt(n, ans);
}

总结:
m i n , m a x min,max min,max 函数的使用和数位分解

<think>好的,我现在需要帮用户将提供的GESP二级题目按照题目类型进行分类,特别是那些有共同模板相似代码的题目。首先,我需要仔细阅读每个题目的编号名称,分析它们可能的考查内容解题方法。 首先,题目列表里有多个涉及“画”的题目,比如B3844画正方形、B3837画三角形、B3865小杨的X字矩阵、B3924小杨的H字矩阵、B3955小杨的日字矩阵、B4037小杨的N字矩阵以及B4259等差矩阵。这些题目看起来都是需要根据某种规律输出特定字符组成的图形,比如矩阵或几何形状。这类题目通常需要使用循环结构控制输出的行列,根据条件判断在特定位置打印字符,其他位置填充空格或其他字符。所以这类题目应该归为“字符图案绘制类”。 接下来,题目中有几个涉及数学计算的题目。例如B3845勾股数、B3836百鸡问题、B3840找素数、B3841自幂数判断、B4002平方之、B4007计数、B4036数位之、B4064寻找数字、B4065数位。这些题目可能需要用到数学公式、循环遍历条件判断。比如勾股数需要寻找满足a² + b² = c²的三元组;百鸡问题涉及不定方程求解;找素数自幂数判断需要遍历数字并检查特定条件;平方之可能涉及平方数的计算;计数数位则与数字的各位处理相关。这类题目可以归为“数学计算与数论类”。 还有一些题目涉及特定的算法或逻辑,比如B3866数字黑洞,可能需要处理数字的各位数排序减法操作,形成循环直到达到特定条件;B3923小杨做题可能涉及模拟或递推;B3954乘法问题可能涉及数值计算或动态规划;B4260时间跨越可能涉及日期时间计算差值处理。这些题目可能需要更具体的算法或逻辑处理,但暂时不确定是否有共同模板,可能需要进一步分析。不过根据用户要求,按共同模板代码相似性分类,可能暂时归为“特殊算法与逻辑处理类”。 现在需要验证每个分类下的题目是否确实有相似的解题模板。例如,字符绘制类的题目,无论画的是X、H、日字还是N字,基本都需要双重循环遍历行列,根据行列索引决定输出字符,因此代码结构相似,只是判断条件不同。数学计算类的题目,如找素数、自幂数、勾股数,都需要遍历数字,检查条件,结构上都是循环加条件判断,可能使用函数封装检查逻辑,代码结构类似。特殊算法类如数字黑洞,可能涉及循环处理数字的各位数重组,直到出现6174,这种处理方式比较独特,但若有多题涉及数位处理,可能归为数学计算类。但B3866B4065都涉及数位,可能需要重新分类。 例如,B4036数位之、B4065数位、B4064寻找数字都与数字的各位处理相关,可能应归入数学计算类的子类“数位处理”。同样,B3841自幂数判断也需要分解数字的各位计算幂,属于数位处理。而B3840找素数属于素数筛查,B3845勾股数属于数学公式应用,B3836百鸡问题属于枚举解方程,B4002平方之可能涉及平方数的组合,B4007计数可能统计满足条件的数字个数。因此数学计算类可细分为数位处理、素数相关、公式应用等,但用户希望按共同模板分类,因此可能合并,因为这些题目在代码结构上都有循环条件判断,处理方式类似,只是具体条件不同。 可能调整分类,将数位相关的题目归为一类,其他数学题归为另一类。但根据用户需求,尽量按代码相似性分类,可能数位处理数学计算可以合并,因为它们都涉及循环条件检查,只是处理的具体数学问题不同,但代码结构相似。 再考虑特殊算法类,如B3866数字黑洞需要多次变换数字,直到满足条件,可能使用循环字符串或数组处理数位,这类代码结构可能与数位处理类似,但流程更长,可能归入数学计算类下的子类,或者单独分类。根据用户示例,可能统一归为数学计算类。 最后,时间相关的题目如B4260时间跨越,可能涉及日期计算,处理小时分钟,计算时间差,这类问题可能需要不同的处理方式,比如将时间转换为分钟再进行计算,属于另一类别,但当前列表中只有一题,可能归入特殊算法类。 综上,初步分类如下: 1. 字符图案绘制类:涉及输出特定字符组成的图形,使用循环条件判断控制输出。 2. 数学计算与数论类:涉及数学公式、数位处理、素数、自幂数、勾股数等,使用循环条件判断解决问题。 3. 特殊算法与逻辑处理类:涉及较复杂的算法或逻辑,如数字黑洞、时间计算等。 需要检查每个题目是否归类正确: 字符绘制类: - B3844画正方形:输出正方形,可能根据边长循环输出* - B3837画三角形:类似,根据行数输出递增的*号 - B3865小杨的X字矩阵:在矩阵中画X,对角线上输出* - B3924H字矩阵:在特定行列输出H字符 - B3955日字矩阵:类似,输出日字形边框 - B4037N字矩阵:可能按N的笔画输出字符 - B4259等差矩阵:可能填充等差数列的数字,但如果是字符图案,可能属于此类,否则可能属于数学类。根据题目名称“等差矩阵”,可能是数字填充,但用户提到的是字符矩阵,需要确认。假设是字符排列,归此类。 数学计算类: - B3845勾股数:寻找满足勾股定理的三元组 - B3836百鸡问题:解方程100钱买百鸡 - B3840找素数:找出区间内的素数 - B3841自幂数判断:如阿姆斯特朗数 - B4002平方之:可能判断某数能否表示为两平方数之 - B4007计数:统计满足条件的数 - B4036数位之:计算一个数的各位之 - B4064寻找数字:可能查找具有特定数位特征的数 - B4065数位:同上,可能是计算数位 - B3866数字黑洞:处理数位重组,直到得到6174,属于数位处理,归此类 - B3923小杨做题:可能涉及数学问题,如累加、递推,需看具体内容,假设是数学计算 - B3954乘法问题:可能涉及大数乘法或特定乘法规则,属于数学计算 特殊算法类: - B4260时间跨越:处理时间差计算,可能单独一类,但若只有一题,可能并入数学计算 不过B3954B3923若涉及数学计算,可能归入数学类。因此,可能将大部分题目归入前两类,特殊算法类可能较少。 因此,最终分类: 字符图案绘制类:B3844、B3837、B3865、B3924、B3955、B4037、B4259 数学计算与数论类:B3845、B3836、B3840、B3841、B4002、B4007、B4036、B4064、B4065、B3866、B3923、B3954 特殊算法与逻辑处理类:B4260 但需要确认是否有其他题目属于特殊算法。例如,B3866数字黑洞可能更复杂,属于数学计算中的数位处理,归入数学类。B4260时间跨越可能单独处理时间,属于另一类。但用户希望按共同模板分类,因此可能将数学计算类再细分: 但根据用户的要求,尽量按代码结构相似性分类。例如,数位处理的题目,如B4036、B4065、B3841、B3866,它们的代码都需要分解数字的各位,进行计算或重组,因此可能有相似的循环取模运算,归为一类。而素数判断、勾股数、百鸡问题等可能需要不同的循环结构,但都属于数学问题的大类,代码可能使用多重循环条件判断,结构相似。 综上,可能将题目分为: 1. 字符图案绘制类 2. 数学计算与数论类(包括数位处理、素数、勾股数等) 3. 特殊算法与逻辑处理类(如时间计算) 但可能用户希望更细的分类,例如将数位处理单独分类,但根据用户提供的例子,可能合并。因此最终分类如下: 字符图案绘制类:所有需要输出特定字符排列的题目。 数学计算与数论类:涉及数学公式、数论问题、数位处理等的题目。 特殊算法类:其他需要特定算法处理的题目。 根据这个分类,用户的问题中的各个题目可以归类如下: 字符图案绘制类: - B3844 画正方形 - B3837 画三角形 - B3865 小杨的X字矩阵 - B3924 小杨的H字矩阵 - B3955 小杨的日字矩阵 - B4037 小杨的N字矩阵 - B4259 等差矩阵 数学计算与数论类: - B3845 勾股数 - B3836 百鸡问题 - B3840 找素数 - B3841 自幂数判断 - B4002 平方之 - B4007 计数 - B4036 数位之 - B4064 寻找数字 - B4065 数位 - B3866 数字黑洞 - B3923 小杨做题(假设涉及数学计算) - B3954 乘法问题 特殊算法与逻辑处理类: - B4260 时间跨越 这样分类后,用户可以根据类型找到相似的解题模板,例如字符绘制类题目通常需要双重循环条件判断输出字符,数学类题目需要循环遍历数学条件判断,数位处理则需要分解各位数字等。</think>以下是根据题目类型代码模板相似性对GESP二级题目的分类: --- ### 一、字符图案绘制类 **共同特征**:需按照特定规律输出字符矩阵,代码结构以双重循环为主,通过行列坐标判断输出内容。 1. $B3844$ [画正方形] 2. $B3837$ [画三角形] 3. $B3865$ [小杨的X字矩阵] 4. $B3924$ [小杨的H字矩阵] 5. $B3955$ [小杨的日字矩阵] 6. $B4037$ [小杨的N字矩阵] 7. $B4259$ [等差矩阵] **典型代码模板**: ```python n = int(input()) for i in range(n): for j in range(n): if 特定条件: # 如对角线、边框等 print("*", end="") else: print(" ", end="") print() ``` --- ### 二、数学计算与数论类 **共同特征**:需遍历数字或组合,结合数学公式或定理进行条件判断,代码通常包含循环分支结构。 #### 子类1:数位处理 1. $B3841$ [自幂数判断] 2. $B4036$ [数位之] 3. $B4064$ [寻找数字] 4. $B4065$ [数位] 5. $B3866$ [数字黑洞] **典型代码模板**: ```python n = input().strip() while True: digits = list(n) # 对数位进行操作(如排序、求等) if 满足终止条件: break ``` #### 子类2:素数相关 1. $B3840$ [找素数] **模板**:通过遍历取模判断素数。 #### 子类3:公式应用 1. $B3845$ [勾股数] 2. $B3836$ [百鸡问题] 3. $B4002$ [平方之] 4. $B4007$ [计数] **模板**:多重循环枚举组合,验证数学公式(如 $a^2 + b^2 = c^2$)。 --- ### 三、特殊算法与逻辑类 **共同特征**:需实现特定算法逻辑(如模拟、日期计算),代码流程较复杂。 1. $B3923$ [小杨做题] 2. $B3954$ [乘法问题] 3. $B4260$ [时间跨越] **示例**: 时间差值计算需将时间转换为分钟数后处理。 --- ### 分类总结表 | 类型 | 题目编号 | |--------------------|-------------------------------------------| | 字符图案绘制类 | $B3844$, $B3837$, $B3865$, $B3924$, $B3955$, $B4037$, $B4259$ | | 数学计算与数论类 | $B3845$, $B3836$, $B3840$, $B3841$, $B4002$, $B4007$, $B4036$, $B4064$, $B4065$, $B3866$ | | 特殊算法与逻辑类 | $B3923$, $B3954$, $B4260$ | 通过此分类,可快速定位相似题目并复用代码框架。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值