题目:(卡片)
题目描述(12届 C&C++ B组B题)
解题思路:
该问题要求用数字卡片从 1 开始拼出整数,直到某一时刻不能拼出时停止。要确定拼到哪个最大整数,需要统计 每个数字“1”被用过的次数,直到卡片中“1”不够为止。
-
初步分析:
-
从数字 1 开始,每个整数可以通过其十进制表示形式拆分成各个位上的数字。
-
每次使用的数字“1”数量会随着拼接的整数不断增加。
-
终止条件是“1”的使用次数达到或超过 2021。
-
-
具体步骤:
-
用一个计数器
sum
统计数字“1”的使用次数。 -
逐一检查从 1 开始的整数,逐位提取其中的数字,如果是“1”,则增加计数器。
-
当计数器达到或超过 2021 时,停止循环,当前整数即为结果。
-
-
实现方式:
-
使用两层循环:
-
外层循环从 1 开始逐一增加数字,直到满足终止条件。
-
内层循环提取当前数字的每一位,并判断是否为“1”。
-
-
代码实现(C语言):
#include <stdio.h>
int main(void)
{
int i, j, sum = 0;
// 从 1 开始拼数字
for (i = 1;; i++)
{
// 将当前数字 i 的每一位拆分并检查是否是 1
for (j = i; j != 0; j /= 10)
if (j % 10 == 1) // 如果当前位是 1
sum++;
// 当统计的 1 的数量达到目标时,停止循环
if (sum >= 2021)
break;
}
// 输出最后拼出的最大数字
printf("%d", i);
return 0;
}
得到运行结果:
难度分析
⭐️⭐️⭐️
总结
-
算法逻辑清晰,简单易懂。
-
逐位处理数字,可以有效地统计目标数字的出现次数。