1~n 之间 数字x出现的次数
2017-08-31 21:00
211 查看
声明: 仅个人小记
0;
暴力法
/* 输入: n 整数, 0 =< x <= 9 输出: 1~n 中 数字x出现的次数 */ #include <iostream> #include <ctime> using namespace std; int main(void) { clock_t startTime, endTime; int n, x; cin >> n >> x; startTime = clock(); int t; int cnt = 0; for (int i = 1; i <= n; i ++) { t = i; while (t) { if (t%10 == x) cnt ++; t /= 10; } } endTime = clock(); cout << cnt << endl; cout << "time elpased: " << double(endTime-startTime) *1000 /CLOCKS_PER_SEC << "ms" << endl; cout << endTime-startTime << endl; return 0; }
优化
/* 效率极大提升,算法耗费时间仅仅和给定的整数的长度有关 */ #include <iostream> #include <ctime> using namespace std; int main(void) { int n, x; cin >> n >> x; int startTime, endTime; startTime = clock(); int t; int cnt = 0; int k = 1; int a; int b = n; while (b) { a = b % 10; b = b / 10; cnt += b * k; if (a > x) cnt += k; else if (a == x) cnt += (n%k+1); k *= 10; } if (x == 0) { // x == 0 时,不一样的地方是 我们都知道 01 02 03 不算是两位数, 001 002 003 不算是三位数, 所以减去 (100+10) cnt --;// 因为起点是 1 不是 0, 所以个位上的0 少了一个 int p = 10; int q = 0; while (n/10) { q += p; p *= 10; n/=1; } cnt -= q; } endTime = clock(); cout << cnt << endl; cout << "time elpased : " << (double)(startTime-endTime)*1000/CLOCKS_PER_SEC << "ms"<<endl; return 0; }
时间花费对比
0;
相关文章推荐
- [分析总结:leetcode-Number of Digit One]寻找整数1到n之间所有数字中1出现的次数
- (Realx 数论1.28)POJ 2282 The Counting Problem(区间统计数字:统计a、b之间各个数字(0~9)出现的次数)
- 随机生成 50 个数字,每个数字的范围在 [10, 50] 之间,统计每个数字出现的次数,最后将每个数字和它出现的次数打印出来
- 1-100之间数字中9出现的次数
- 从1到n之间的数字1出现的次数
- 剑指offer——数字在排序数组中出现的次数
- 在排序数组中,找出给定数字的出现次数
- python(dict字典相关知识以及小例子:生成一个列表,存放100个随机整数,找出出现次数最多的数字)
- 第13周-项目1-小玩文件-用键盘输入文件名,统计输出文件中每个字母、数字字符出现的次数
- 【剑指offer】出现次数超过一半的数字
- 《剑指offer》-找出数组中出现次数超过一半的数字
- 剑指Offer面试题:32.数字在排序数组中出现的次数
- 《剑指offer》刷题笔记(知识迁移能力):数字在排序数组中出现的次数
- 数组中出现次数超过一半的数字
- 找出数组里出现次数超过一半的数字
- java 求数字在排序数组中出现的次数(O(logn))
- 统计输入字符串中: 各个数字、空白字符、以及其他所有字符出现的次数
- 有序数组中数字出现次数
- 统计各数字出现的次数
- 数字在排序数组中出现的次数