• C++
  • 判断数字出现了几次

  • @ 2025-5-31 20:22:30

4 条评论

  • @ 2025-5-31 20:29:23

    解题思路(C++)

    这道题要求统计从1到n的所有整数中,数字k出现的总次数。我们需要遍历每个数,分解其每一位并检查是否等于k。

    方法步骤

    1. 输入处理:读取正整数n和k。
    2. 遍历范围:从1到n,逐个检查每个数。
    3. 数位分解:对于每个数,通过取模(%10)和整除(/10)操作分解每一位。
    4. 统计次数:检查每一位是否等于k,累加计数器。
    5. 输出结果:遍历结束后,输出计数器的值。

    代码实现

    #include <iostream>
    using namespace std;
    
    int main() {
        int n, k;
        cin >> n >> k;  // 读取输入
        
        int count = 0;  // 初始化计数器
        
        // 遍历1到n的每个数
        for (int i = 1; i <= n; i++) {
            int num = i;
            // 分解每一位并检查
            while (num > 0) {
                int digit = num % 10;  // 获取当前最低位
                if (digit == k) {
                    count++;  // 若等于k,计数器加1
                }
                num /= 10;  // 移除最低位
            }
        }
        
        cout << count << endl;  // 输出结果
        return 0;
    }
    

    代码解释

    1. 输入读取:使用cin读取两个整数n和k。
    2. 计数器初始化:用count变量记录数字k出现的总次数。
    3. 遍历范围:使用for循环从1到n,遍历每个数。
    4. 数位分解:对于每个数i,通过while循环不断分解每一位:
      • num % 10获取当前最低位。
      • 检查该位是否等于k,若是则计数器加1。
      • num /= 10移除已处理的最低位。
    5. 输出结果:循环结束后,输出计数器的值。

    复杂度分析

    • 时间复杂度:O(n * m),其中n是输入的数,m是n的最大位数(对于n<32767,m=5)。
    • 空间复杂度:O(1),只需要常数级的额外空间。

    示例运行

    对于输入13 3

    • 数字3在3中出现1次,在13中出现1次,共2次。
    • 输出结果为2

    这个方法简单直接,适用于题目给定的数据范围。

    • @ 2025-5-31 20:27:38

      1. 原理

      在十进制中,一个整数的每一位都有对应的位权,比如个位的位权是(10^0 = 1),十位的位权是(10^1 = 10),百位的位权是(10^2 = 100) ,以此类推。通过取模(%)和整除(/)运算,可以将一个整数按位拆分。取模运算可以得到一个数除以另一个数的余数,整除运算则得到商(向下取整)。

      2. 具体方法

      • 拆分任意整数 下面是一个将整数按位拆分并输出的示例代码:
      #include <iostream>
      int main() {
          int number;
          std::cout << "请输入一个整数:";
          std::cin >> number;
          while (number > 0) {
              int digit = number % 10; // 使用取模运算,得到最低位数字
              std::cout << digit << " "; // 输出当前位数字
              number /= 10; // 使用整除运算,删除已经处理的最低位
          }
          return 0;
      } 
      

      解释: - 首先从用户处获取一个整数number 。 - 然后进入while循环,只要number大于0 ,就执行循环体。在循环体中,先通过number % 10得到number的最低位数字,存储在digit中并输出。接着,使用number /= 10number的最低位去掉(因为在十进制下,除以10就相当于把最低位去掉) 。不断重复这个过程,直到number的所有位都被拆分并输出。例如输入12345 ,输出为5 4 3 2 1 。

      • 拆分固定位数整数(以三位数为例) 示例代码如下:
      #include <iostream>
      int main() {
          int number;
          std::cout << "请输入一个三位数:";
          std::cin >> number;
          // 验证输入是否为三位数
          if (number < 100 || number > 999) {
              std::cout << "输入的不是一个三位数!" << endl;
              return 1; // 返回非零值表示程序异常结束
          }
          int units = number % 10; // 个位,使用取模运算得到
          int tens = (number / 10) % 10; // 十位,先整除10去掉个位,再取模得到十位数字
          int hundreds = number / 100; // 百位,直接整除100得到百位数字
          std::cout << "个位:" << units << ",十位:" << tens << ",百位:" << hundreds << endl;
          return 0;
      } 
      

      解释: - 先获取用户输入的一个数,然后检查它是否在100到999之间,若不是则提示错误并结束程序。 - 对于个位,直接用number % 10获取。对于十位,先将number除以10 ,去掉个位,再对结果取模10 ,就得到十位数字。对于百位,直接将number除以100 ,就得到百位数字。最后输出各个数位上的数字。

      3. 应用场景

      • 数字统计:比如统计一个整数中某个数字出现的次数。可以将整数按位拆分,然后判断每一位是否是要统计的数字,进行计数。
      • 回文数判断:把一个整数按位拆分后,将拆分后的数字序列反转,再与原数比较,如果相同则是回文数。
      • 水仙花数判断:水仙花数是指一个三位数,其各位数字的立方和等于该数本身。通过拆分三位数的各个数位,分别计算各位数字的立方并求和,再与原数比较,判断是否为水仙花数。
      • @ 2025-5-31 20:26:37

        题目解析

        一、题目类型与核心考点

        本题属于基础的数值统计类编程题,核心考点是通过合理的算法来统计指定数字在一定范围内出现的次数。主要涉及到整数的遍历、数位的分解与判断等编程逻辑。

        二、题目条件理解

        1. 已知条件
          • 输入两个正整数,n表示统计范围的上限(从1到n ),k表示需要统计出现次数的数字。
          • 限定范围为0 < n < 327670 < k < 10 ,即n是一个相对较小的正整数,k是一位数。
        2. 约束条件
          • 要求统计从1到n(包含n )这些数中数字k出现的总次数,并将结果以整数形式输出。

        三、解题思路分析

        1. 遍历数字范围 使用循环结构从1开始遍历到n ,对每个数进行处理。例如在大多数编程语言中可以使用for循环,如for (int i = 1; i <= n; i++) (C++ )或for i in range(1, n + 1) (Python ) 。
        2. 分解数位并统计 对于循环中的每个数,需要将其各个数位分解出来,判断是否等于k 。可以通过取余和整除操作来实现数位分解。比如在十进制数中,通过不断对该数进行取余% 10操作获取个位数字,然后整除/ 10(在Python中是// 10 )去掉已处理的个位数字,继续处理下一位,直到该数变为0。每发现一个数位等于k ,就将统计计数器加1。
        3. 输出结果 循环结束后,统计计数器中存储的数值就是数字k在1到n之间出现的总次数,将其按照要求输出即可。

        四、示例代码思路(以Python为例)

        n, k = map(int, input().split())
        count = 0
        for i in range(1, n + 1):
            num = i
            while num > 0:
                digit = num % 10
                if digit == k:
                    count += 1
                num = num // 10
        print(count)
        
        1. 首先通过input().split()获取输入并使用map函数将其转换为整数,赋值给nk
        2. 然后使用for循环遍历从1到n的所有数字i ,对于每个i ,通过while循环对其进行数位分解,判断每个数位是否等于k ,如果等于则将统计计数器count加1。
        3. 最后输出统计结果count
        • @ 2025-5-31 20:25:57
          2、判断数字出现了几次
          【题目描述】
          给定一个正整数n,判断从1到这个数本身的所有数中,一共出现了多少次数字k。
          【输入格式】
          输入共1行,包括一个正整数n和一个正整数k。(0 < n <32767, 0 < k < 10)
          【输出格式】
          输出共1行,一个整数,表示1到n之间的所有数(包括n),一共出现了几次k。
          【样例输入】
          13 3
          【样例输出】
          2 
          
          • 1