原题链接:数字统计
解题思路:数位DP
注意事项:
参考代码:
# include <iostream> # include <cmath> using namespace std; int dgt(int n) // 计算整数n有多少位 { int res = 0; while (n) ++ res, n /= 10; return res; } int cnt(int n, int i) // 计算从1到n的整数中数字i出现多少次 { int res = 0, d = dgt(n); for (int j = 1; j <= d; ++ j) // 从右到左第j位上数字i出现多少次 { // l和r是第j位左边和右边的整数 ; dj是第j位的数字 int p = pow(10, j - 1) int l = n / p / 10, r = n % p, dj = n / p % 10; // 计算第j位左边的整数小于l 的情况 if (i) res += l * p; if (!i && l) res += (l - 1) * p; // 如果i = 0, 左边高位不能全为0 // 计算第j位左边的整数等于l的情况 if ( (dj > i) && (i || l) ) res += p; if ( (dj == i) && (i || l) ) res += r + 1; } return res; } int main() { int n; cin >> n; for (int i = 0; i <= 9; ++ i) cout << cnt(n, i) << ' '; cout << endl; return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复