数字统计问题

1. 
     一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或006。数字统计问题要求对给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9。

思路:对于n位数,例如3位数,000-999,出现0,1,2...9的次数相同,记每个数字出现的次数为avg,这10个数字出现的总次数为sum=10*avg。

而n位数共有10^n个数,每个具体的数对于sum的贡献为n次。

得到:10*avg=n*10^n,

解出   avg=n*10^(n-1)。

2.

比如,对于一个数字34567,我们可以这样来计算从1到34567之间所有数字中每个数字出现的次数:
从0到9999,这个区间的每个数字的出现次数可以使用原著中给出的递推公式,即每个数字出现4000次。

从10000到19999,中间除去万位的1不算,又是一个从0000到9999的排列,这样的话,从0到34567之间

的这样的区间共有3个。所以从00000到29999之间除万位外每个数字出现次数为3*4000次。然后再统计

万位数字,每个区间长度为10000,所以0,1,2在万位上各出现10000次。而3则出现4567+1=4568次。

之后,抛掉万位数字,对于4567,再使用上面的方法计算,一直计算到个位即可。

3.

 1 // advance example
 2 #include <iostream>     // std::cout
 3 #include <iterator>     // std::advance
 4 #include <list>         // std::list
 5 #include <cmath>
 6
 7  void statNumber(int n) {
 8     int m, i, j, k, t, x, len = log10(n);//*****调用函数求数字位数,机智 *****
 9     char d[16];
10     int pow10[12] = {1}, count[10] = {0};
11    // cout<<pow10[2]<<endl;
12     for(i = 1; i < 12; i++) {
13     pow10[i] = pow10[i-1] * 10;
14     }
15     sprintf(d, "%d", n);//example:n=9876,   d[0]=9,d[1]=8,d[2]=7,d[3]=6,d[4..15]=[]
16    for( i=0;i<16;++i)
17    {
18     putchar(d[i]);
19     putchar(‘\n‘);
20 }
21     m = n+1;//!!!
22     for(i = 0; i <= len; i++) {
23     x = d[i] - ‘0‘;
24     t = (m-1) / pow10[len-i];
25
26     count[x] += m - t * pow10[len-i];
27
28     t /= 10;
29     j = 0;
30     while(j <= x-1) {
31         count[j] += (t + 1) * pow10[len-i];
32         j++;
33     }
34     while(j < 10) {
35         count[j] += t * pow10[len - i];
36         j++;
37     }
38     count[0] -= pow10[len-i]; /* 第i个数位上前10^i个0是无意义的 */
39     }
40     for(j = 0; j < 10; j++) {
41     printf("%d\n", count[j]);
42     }
43 }
44 int main()
45 {
46     statNumber(11);
47     system("PAUSE");
48     return 1;
49
50     } 
时间: 2024-11-04 15:24:19

数字统计问题的相关文章

SDUT OJ 1704 数字统计问题

SDUT OJ 1704 数字统计问题 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40930259 昨天晚上学弟问了OJ上这个题,群里说不清楚,就写个解题报告吧. 题目大意: 中文题目,就不翻译了-.- 解题思路: 不知道算不算一个典型的数位DP,反正有点那个意思,感觉确实也可以用记忆话搜索,两个差不多的意思. 我找了一下,这个问题好像是算法设计与实验题解上面的一道题,别的OJ上没有,所以就在自己OJ上做了. 大体的思路

数字统计(0)&lt;P2010_1&gt;

数字统计   (two.pas/c/cpp) [问题描述] 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数.  比如给定范围[2, 22],数字 2 在数2中出现了 1次,在数 12中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6次.  [输入] 输入文件名为 two.in.  输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开.  [输出] 输出文件名为 two.out.  输

一款纯css3实现的数字统计游戏

今天给大家分享一款纯css3实现的数字统计游戏.这款游戏的规则的是将所有的数字相加等于72.这款游戏的数字按钮做得很美观,需要的时候可以借用下.一起看下效果图: 在线预览   源码下载 实现的代码. html代码: <h1> CSS Counter Game</h1> <section> <h2> Pick the numbers that add up to 72:</h1> <input id="a" type=&q

AC日记——数字统计 openjudge 1.5 41

41:数字统计 总时间限制:  1000ms 内存限制:  65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次. 输入 输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开. 输出 输出共 1 行,表示数字 2 出现的次数. 样例输入 样例 #1: 2 22 样例 #2: 2 100 样

zznu 1255 数字统计(数位DP, 数学方法)

最近在学数位DP, 感觉还是满有收获的! 做了几个题之后想起来自己OJ上曾经做的一道题,以前是用数学方法写的,现在改用数位DP来写了一遍. 题目: 1255: 数字统计 时间限制: 1 Sec  内存限制: 128 MB提交: 31  解决: 4[提交][状态] 题目描述 一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码按照通常的习惯编排, 每个页码都不含多余的前导数字0.例如,第6 页用数字6 表示,而不是06 或006 等.数 字计数问题要求对给定书的总页码n,计算出书的全部页码中

[华为机试练习题]16.数字统计

题目 题目标题: 对输入的整型数组,输出数组元素中的最大值.最大值的个数.最小值和最小值的个数 详细描述: 接口说明 原型: voidOutputMaxAndMin(int * pInputInteger,intInputNum,int * pMaxValue,int * pMaxNum,int * pMinValue,int * pMinNum); 输入参数: Int * pInputInteger:整型数组指针 Int InputNum:数组元素个数 输出参数(指针指向的内存区域保证有效):

数字统计(LeetCode Number of digit One)

1.      一本书的页码从自然数1开始顺序编码直到自然数n.书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0.例如第6页用6表示而不是06或 006.数字统计问题要求对给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9. 思路:对于n位数,例如3位数,000-999,出现0,1,2...9的次数相同,记每个数字出现的次数为avg,这10个数字出现的总次数为sum=10*avg. 而n位数共有10^n个数,每个具体的数对于sum的贡献为n次. 得到:1

Chang&#39;an(Palindrome Numbers-回文数字统计)

统计前半个回文串 #include <bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define ForD(i,n) for(int i=n;i;i--) #define ForkD(i,k,n) for(int i=n;i>=k;i--) #define Rep(i,n) for(int i=0;i<n ;i++) #define MAXN (1000000000+10

洛谷——P1179 数字统计

https://www.luogu.org/problem/show?pid=1179 题目描述 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出 现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6 次. 输入输出格式 输入格式: 输入文件名为 two.in. 输入共 1 行,为两个正整数 L 和 R,之间用一个