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 <stdio.h>

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

实现代码:

#include <stdio.h>
#include <string.h>

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

实现代码:

#include <stdio.h>

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;
}

优点:

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

缺点:

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

总结

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失去的十年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值