C++编程计算书页中各数字出现次数

需积分: 11 6 下载量 114 浏览量 更新于2024-09-10 收藏 1KB TXT 举报
在这个C++算法问题中,我们讨论的是如何统计一个从1到n(n不包含0)的自然数序列中每个数字0到9出现的次数。给定一个整数n,我们的目标是实现一个函数来计算从1到n的所有页码中每个数字的使用频率。 首先,程序定义了一个名为`f`的辅助函数,用于计算一个十进制数的位数,即`n`的位数减一。这是通过将`n`除以10的幂次得到的,其中幂的指数是`n-1`的浮点值。这个函数返回的结果表示在n的最右侧的非零数字之前需要的零的数量。 接下来是`CountNumber`函数,它接受一个整数m作为参数,并维护一个长度为10的整数数组a,用于存储0到9的出现次数。函数首先检查m是否为0,如果是,则递归结束。如果m不为0,它首先计算m在当前位数n中的次数(k),然后根据n的值进行不同的处理: 1. 如果n大于1,表示m有多个位数,需要逐个处理每一位。首先,为1到k-1的每一位分配了`pow(10, (double)(n-1))`个0。接着,因为k个位置已经填满,所以将k乘以`f(n-1)`添加到对应数字上。最后,对剩余的m减去`k * pow(10, (double)(n-1))`,并更新0的计数。 2. 如果n等于1,表示m是一个一位数,只需遍历并将每位数字加1。 3. 当m不再需要当前位数时,更新m的值,如果m变为0,表示已经处理到最低位,此时将n-1个0添加到0的计数中。否则,根据新的位数n1继续递归调用`CountNumber`函数。 `main`函数中,程序读取用户输入的n值,创建一个大小为10的数组,然后调用`CountNumber`函数来填充数组,最后输出每个数字在所有页码中出现的次数。 总结来说,这段代码实现了一个高效的算法,利用了位运算和递归,能够准确地统计从1到n的自然数序列中每个数字0到9的使用频率。这在处理大型数据集时具有很好的性能,并且结构清晰,易于理解。