• C语言练习百题之9的次数


    题目:统计1~100之间出现了几次数字9

    程序分析

    我们需要实现一个程序来统计1到100之间数字9出现的次数。在这个问题中,我们可以使用三种方法来解决:

    1. 迭代法: 使用循环迭代从1到100,逐个检查每个数字中是否包含数字9。
    2. 字符串法: 将数字转换为字符串,然后检查字符串中是否包含字符’9’。
    3. 数学法: 使用数学方法来计算数字9的出现次数,无需实际遍历所有数字。

    让我们分别实现这三种方法。

    方法一:迭代法

    解题思路:

    1. 使用循环迭代从1到100。
    2. 对于每个数字,将其不断除以10并检查余数,看是否包含数字9。
    3. 如果包含数字9,则增加计数器。
    4. 最后输出计数器的值。

    实现代码:

    #include 
    
    int main() {
        int count = 0;
    
        for (int num = 1; num <= 100; num++) {
            int n = num;
            while (n > 0) {
                if (n % 10 == 9) {
                    count++;
                    break;
                }
                n /= 10;
            }
        }
    
        printf("Method 1: The digit 9 appears %d times between 1 and 100.\n", count);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    优点:

    • 简单易懂。
    • 通用性强,适用于各种编程语言。

    缺点:

    • 在大范围内的数字统计时可能效率较低。

    方法二:字符串

    解题思路:

    1. 使用循环迭代从1到100。
    2. 将每个数字转换为字符串。
    3. 对于每个字符串,检查其中是否包含字符’9’。
    4. 如果包含字符’9’,增加计数器。
    5. 最后输出计数器的值。

    实现代码:

    #include 
    #include 
    
    int main() {
        int count = 0;
    
        for (int num = 1; num <= 100; num++) {
            char str[4];  // 数字不超过3位
            snprintf(str, sizeof(str), "%d", num);
    
            if (strchr(str, '9') != NULL) {
                count++;
            }
        }
    
        printf("Method 2: The digit 9 appears %d times between 1 and 100.\n", count);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    优点:

    • 使用字符串函数简化了检查过程。
    • 通用性强,适用于各种编程语言。

    缺点:

    • 需要额外的内存来存储字符串。
    • 在大范围内的数字统计时可能效率较低。

    方法三:数学法

    解题思路:

    1. 分析数字9在个位、十位和百位的出现规律。
    2. 从1到100,每10个数字中,有一个包含数字9(9, 19, 29, …)。
    3. 对于每10个数字,有9个不包含数字9。
    4. 计算包含数字9的组数和不包含数字9的组数。
    5. 计算总共包含数字9的次数。

    实现代码:

    #include 
    
    int main() {
        int count = 0;
    
        for (int num = 1; num <= 100; num++) {
            if (num % 10 == 9 || (num / 10) % 10 == 9) {
                count++;
            }
        }
    
        printf("Method 3: The digit 9 appears %d times between 1 and 100.\n", count);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    优点:

    • 高效,无需实际遍历所有数字。
    • 不需要额外的内存。

    缺点:

    • 相对于方法一和方法二,更特定于这个问题。

    总结

    在这个问题中,推荐使用方法三,即数学法。它是最高效的解决方案,无需实际遍历所有数字,而是利用规律直接计算出结果。方法一和方法二虽然通用,但在大范围内的数字统计时可能效率较低,而且方法二需要额外的内存来存储字符串。方法三是最好的选择,特别是在需要统计大范围内数字出现次数时。

  • 相关阅读:
    实战经验分享:如何通过HTTP代理解决频繁封IP问题
    黑马JVM总结(二十)
    算法金 | AI 基石,无处不在的朴素贝叶斯算法
    Twain的学习记录和基于Qt的相关开源项目详解
    读书笔记---蛤蟆先生去看心理医生
    数据结构与算法:二分查找(心得)
    web端动效 PAG
    世界前沿技术发展报告2023《世界信息技术发展报告》(三)量子信息技术
    tomcat9w无法启动
    MVC、MVVM、MVP的区别
  • 原文地址:https://blog.csdn.net/2302_79769289/article/details/133802801