页码数字统计问题(数字统计问题)

您所在的位置:网站首页 页码器的实现思路有哪些 页码数字统计问题(数字统计问题)

页码数字统计问题(数字统计问题)

2023-12-26 07:44| 来源: 网络整理| 查看: 265

页码数字统计问题(数字统计问题) 问题描述算法思路与实现代码方法一:暴力遍历法代码1方法二:拆数计算法代码2 代码测试算法复杂度分析

问题描述

一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编码,每个页码都不含有多余的前导数字0。现在给出表示书的总页码的自然数n,计算书的全部页码中分别用到多少次数字0,1,2,3,…, 9。(或者计算说0-9数字出现了多少次)。

例如,给出一个数n=12,则出现的数有1,2,3,4,5,6,7,8,9,10,11,12。这些数中0-9分别出现的次数为:(由上到下分别表示0-9出现的次数,后文程序结果都采用这样的格式) 在这里插入图片描述

题目源于:王晓东.《计算机算法设计与分析》.第5版习题1-1

算法思路与实现代码 方法一:暴力遍历法

思路:设置一个长度为10的数组作为0-9每个数出现次数的计数器,将页码从1~n遍历一遍,提取每一个数的每一位,根据每一位数的值给对应数字计数器加1,最后在循环结束后通过计数器内的结果确定每个数字的出现次数。

代码1 #include int main(){ int arr[10]={0};//存储0-9各个数的出现次数,初始化为零 int n; scanf("%d",&n);//输入n for(int i=1;i0};//存每次数的每一位的值 int len=0; //这个数的位数 int m = i; while(m/10){//采用除10取余的方式,从个位开始获取每一位的值 num[len++] = m%10; m = m/10; } num[len++] = m; for(int j=0;j//打印结果 printf("%d\n",arr[i]); } return 0; } 方法二:拆数计算法

思路:统计0-9每个数,分别在每一位上的出现次数。即对于一个总位数为len的数n,依次计算其第一位(个位),第二位(十位),第三位…,第len位上,0-9每个数出现的次数,再统计每次的计算结果。

每一位上各个数字出现的次数与四个条件有关:这一位上的数的值V(Value),这一位数前面一串数的值F(Front),这一位数后面一串数的值R(Rear),这一位数的位置P。以n=12345的第三位(百位)为例,这一位上0-9各个数出现的个数分别与:V=3,F=12,R=45,P=3.有关。 对于输入数n,其任意位都有VFRP(对于最高位,取F=0;对于第一位,取R=0),考虑其任意一位,有如下四种规则: ① 0 − 9 各 数 在 该 为 的 出 现 次 数 至 少 为 : F × 1 0 P − 1 ② 对 于 0 − 9 中 大 于 V 的 数 , 出 现 次 数 不 必 额 外 增 加 。 ③ 对 于 0 − 9 中 等 于 V 的 数 , 出 现 次 数 与 还 R 有 关 , 需 加 上 : R + 1 ( 0 到 x , 共 有 x + 1 个 数 ) ④ 对 于 1 − 9 中 小 于 V 的 数 , 需 加 上 : 1 0 P − 1 \begin{aligned} ①&0-9各数在该为的出现次数至少为:F×10^{P-1}\\ ②&对于0-9中大于V的数,出现次数不必额外增加。\\ ③&对于0-9中等于V的数,出现次数与还R有关,需加上:R + 1(0到x,共有x+1个数)\\ ④&对于1-9中小于V的数,需加上:10^{P-1} \end{aligned} ①②③④​0−9各数在该为的出现次数至少为:F×10P−1对于0−9中大于V的数,出现次数不必额外增加。对于0−9中等于V的数,出现次数与还R有关,需加上:R+1(0到x,共有x+1个数)对于1−9中小于V的数,需加上:10P−1​ 第四点中不包括0,是因为0不可出现在首位,即没有0,024,0324等数,例如当n=123,考虑P=2(十位),在已考虑①的前提下,考虑④,显然当10};//保存每一个数出现次数的计数器数组 int pow10[10]={1}; //每一位的权值,即10^(P-1) for(int i=1;i // 拆分n的每一位,获取VFR num[0][len] = n%10; num[2][len+1] += n%10*pow10[len] + num[2][len]; n = n/10; num[1][len++]=n; } num[0][len++] = n; int i = 0; for(i=0;i arr[j] += num[1][i]*pow10[i]; //对于0-9中等于V的数,出现次数与还R有关,需加上:R + 1 if(j==num[0][i]){ arr[j] += num[2][i] + 1; } // 对于1-9中小于V的数,需加上:10^(P-1) else if(j



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3