Bootstrap

蓝桥杯每日真题 - 第22天

题目:(卡片)

题目描述(12届 C&C++ B组B题)

解题思路:

该问题要求用数字卡片从 1 开始拼出整数,直到某一时刻不能拼出时停止。要确定拼到哪个最大整数,需要统计 每个数字“1”被用过的次数,直到卡片中“1”不够为止。

  1. 初步分析:

    • 从数字 1 开始,每个整数可以通过其十进制表示形式拆分成各个位上的数字。

    • 每次使用的数字“1”数量会随着拼接的整数不断增加。

    • 终止条件是“1”的使用次数达到或超过 2021。

  2. 具体步骤:

    • 用一个计数器 sum 统计数字“1”的使用次数。

    • 逐一检查从 1 开始的整数,逐位提取其中的数字,如果是“1”,则增加计数器。

    • 当计数器达到或超过 2021 时,停止循环,当前整数即为结果。

  3. 实现方式:

    • 使用两层循环:

      • 外层循环从 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;
}

得到运行结果:

难度分析

⭐️⭐️⭐️

总结

  • 算法逻辑清晰,简单易懂。

  • 逐位处理数字,可以有效地统计目标数字的出现次数。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;