【POJ2282 The Counting Problem】求区间[a,b]中每个数字出现的次数
2013-04-09 21:14
381 查看
题目链接:http://poj.org/problem?id=2282
题目大意:给你两个数a,b,让你计算a到b之间所有的数总共包含多少0~9。
解题思路: 蛋疼的人生蛋疼的题。可以分别统计[0,b]中包含多少个0~9,[0,a]中包含多少个0~9,两个求得的结果相减就是答案了。
举例分析: 299 百位数字有0,1,2,那么它们在百位时分别出现了100次,再对十位数和个位数的99分析,因为[0,99]中0~9出现的频率都是一样的,
分别为2(前一个数的值)*(位数)*10(固定一个数其余位能变化的次数)。
所以对于4567,我们可以这样拆:0~3999,4000~4499,4500~4559,~4560~4567 。求得得总和就是答案了,还要注意一点的是前导0不能加进去,注意把加进去多余的前导0减掉。
View Code
题目大意:给你两个数a,b,让你计算a到b之间所有的数总共包含多少0~9。
解题思路: 蛋疼的人生蛋疼的题。可以分别统计[0,b]中包含多少个0~9,[0,a]中包含多少个0~9,两个求得的结果相减就是答案了。
举例分析: 299 百位数字有0,1,2,那么它们在百位时分别出现了100次,再对十位数和个位数的99分析,因为[0,99]中0~9出现的频率都是一样的,
分别为2(前一个数的值)*(位数)*10(固定一个数其余位能变化的次数)。
所以对于4567,我们可以这样拆:0~3999,4000~4499,4500~4559,~4560~4567 。求得得总和就是答案了,还要注意一点的是前导0不能加进去,注意把加进去多余的前导0减掉。
#include <iostream> #include <sstream> #include <cstring> using namespace std; ///以3456分析,3456可以划分为0~2999,3000~3399,3400~3449,3450~3456 void Cal(string s, int* num) { int k=1; for(int i=0; i<s.size(); i++) k*=10, num[0]-=k; ///去除去0作为前导的情况 for(int i=0; i<s.size(); i++, k/=10) { for(int j=0; j<s[i]-'0'; j++) ///第i位时,对最高位进行分析,比如0~2999,最高位0和1都出现了1000次。 num[j]+=k; for(int j=0; j<10; j++) ///对0~2999分析,[0,999]中0~9出现的概率一样,最高位大小(2)*位数(3)*固定一位的最多次数(100) num[j]+=(s[i]-'0')*(s.size()-i-1)*k/10; for(int j=0; j<i; j++) ///对于前面的每一位,还要后续处理后面没处理到的情况,比如处理最高位3时只处理了0~2999,而没有处理3000~3399,3400~3449,3450~3456等情况,后面处理的时候要考虑到 num[ s[j]-'0' ]+=(s[i]-'0')*k; num[ s[i]-'0' ]++; ///末尾都是0的情况 } } int main() { int n; int num[10]; while(cin >> n) { stringstream sa; memset(num,0,sizeof(num)); string str; sa << n; sa >> str; Cal(str,num); for(int i=0; i<10; i++) cout << num[i] <<endl; } }
View Code
相关文章推荐
- (Realx 数论1.28)POJ 2282 The Counting Problem(区间统计数字:统计a、b之间各个数字(0~9)出现的次数)
- UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。
- 统计区间[a,b]各个数字出现的个数:poj 2282 The Counting Problem poj 3286
- Poj 2282 The Counting Problem[统计区间 0 - 9出现的次数]
- 计算数值区间内某个数字出现的次数
- 第13周-项目1-小玩文件-用键盘输入文件名,统计输出文件中每个字母、数字字符出现的次数
- 从文件读取包含数字和字母字符串,统计每个字符出现的次数,将次数输出到另外一个文件
- 随机产生50个30到35的整数,统计每个数字出现的次数(TreeMap实现),输出时按照数字的降序排列,并且统计出现次数最多的数字和它的次数。
- 统计用户输入的一串数字中每个数字出现的次数
- POJ 3368 Frequent values(RMQ 求区间出现最多次数的数字的次数)
- 计算数组中每个数字出现的次数
- 分块+二分维护,求区间内数字出现的次数
- 统计用户输入的一串数字中每个数字出现的次数
- 快速求解1~n的每个数字出现的次数.
- (使用STL自带的排序函数进行编程7.3.14)UVA 10062 Tell me the frequencies!(求一个字符出现的次数(包括字母和数字)&&按出现的次数降序)
- 第13周 项目5-4 统计每个数字出现的次数
- 定义一个16位长整型数,统计里面0~9每个数字出现的次数。(包括将长整型转化为字符数组的方法及switch的用法)
- POJ 2282-The Counting Problem(组合数学_区间计数)
- POJ2282 The Counting Problem:
- POJ2282:The Counting Problem找规律