统计个数

题目简述:给两个数字a和b,求a和b之间的所有数中k出现的次数总和。比如1和11之间,1出现的次数为4(1,10,11共4个1)。

输入:若干组数据,每行三个整数,a,b,k。以0 0结尾。(0<a,b<100 000 000,0<=k<=9)

输出:输出k出现的次数总和。

解题思路:分治策略。可以分别考虑从0到a和b的这些数中,k出现的次数和,再做减法。 以197和k=1为例,先考虑190~197这8个数,个位1出现一次;其他数位上百位有1个1,8个数一共1*8个1。0~189这些数中,个位1出现19次。再之后,就不需要考虑个位上的1了,value可以安心*10了。如果是0的话,要特殊处理。(因为十位为0的000和个位为0的000是一种情况,而十位为1的010和个位为1的001是两种情况。)value*10后,就开始考虑十位上的1了。这个时候,考虑的数是100~189。一直下去......

代码:

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 #define ll long long
 7
 8 ll value,ans;
 9 int k;
10
11 inline void Swap(int &a,int &b);
12 void Deal(int n);
13
14 int main(){
15     //freopen("D:\\input.in","r",stdin);
16     int a,b;
17     while(scanf("%d %d %d",&a,&b,&k),a){
18         if(a==b){
19             ans=0;
20             while(a){
21                 value=a%10;
22                 if(value==k)    ans++;
23                 a/=10;
24             }
25         }else{
26             if(a<b) Swap(a,b);
27             ans=0;
28             value=1;
29             Deal(a);
30             value=-1;//Deal(a)-Deal(b)
31             Deal(b-1);
32         }
33         printf("%lld\n",ans);
34     }
35     return 0;
36 }
37 inline void Swap(int &a,int &b){
38     int t=a;
39     a=b;
40     b=t;
41 }
42 void Deal(int n){
43     if(n<=0)    return;
44     int one,ten,tmp;
45     one=n%10;
46     n/=10;
47     ten=n;
48     if(one>=k)  ans+=value;//先看个位
49     while(ten){            //十位以上的每个数对应one+1个个位数变化
50         tmp=ten%10;
51         if(tmp==k)  ans+=value*(one+1);
52         ten/=10;
53     }
54     ans+=value*n;//比如197,考虑十位以上0~18.
55     if(k==0)    ans-=value;//将第一位是0的情况排除
56     value*=10;             //变权
57     Deal(n-1);
58 }

时间: 2024-08-03 08:31:04

统计个数的相关文章

一些代码 I (斐波那契、for...else...、try和return、classmethod、统计个数)

1. 斐波那契 from itertools import islice def fib(): a, b = 0, 1 while True: yield a a, b = b, a+b print list(islice(fib(), 5)) # [0, 1, 1, 2, 3] 2. for……else……用法(以查找素数为例) 正常版本: 1 def print_prime(n): 2 for i in xrange(2, n): 3 found = True 4 for j in xran

斐波拉切字符串统计个数 Fibonacci String

Problem:  s0 = "a", s1 = "b", s2 = "ba", s3 = "bab", s4 = "babba", s4 = "babbabab", is called Fibonacci string. For the string with index n, given a string str = "bb", calculate how man

【sql: 联系题 23 24】查询同名学生名单,并统计同名人数 找到同名的名字并统计个数,查询 1990 年出生的学生名单

题目23:查询同名学生名单,并统计同名人数 找到同名的名字并统计个数 一开始这个sql 写不出来,看了答案后好简单,也更加加深了我多count 的用法 SELECT stdentname,COUNT(*) FROM student GROUP BY stdentname HAVING COUNT(*)>=2 ; 题目24:查询 1990 年出生的学生名单 这个题目我写的是用like 直接查询出来,但是还有第二种写法,用关键字YEAR 表示年 第二种写法: SELECT * FROM studen

生成随机数,统计个数,按序排列

有以下一个题目: (一)生成随机数可以用以下方法: 上面用了两种方法生成随机数, 1)采用Random类的nextInt(int a)方法,该方法返回 一个大于等于0且小于a的随机整数,再加上10,就是  10<=result<51等价于[10,50]. 2)采用Math.random()方法,该方法返回一个大于等于0且小于1的double类型的小数,然后再乘以41,经过强制类型转换再加10,就能得出[10,50]的随机数. 下面我们来解决上述的题目: 声明一个数组count,用了存放出现50

二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

一.基本概念 每个结点最多有两棵子树,左子树和右子树,次序不可以颠倒. 性质: 1.非空二叉树的第n层上至多有2^(n-1)个元素. 2.深度为h的二叉树至多有2^h-1个结点. 满二叉树:所有终端都在同一层次,且非终端结点的度数为2. 在满二叉树中若其深度为h,则其所包含的结点数必为2^h-1. 完全二叉树:除了最大的层次即成为一颗满二叉树且层次最大那层所有的结点均向左靠齐,即集中在左面的位置上,不能有空位置. 对于完全二叉树,设一个结点为i则其父节点为i/2,2i为左子节点,2i+1为右子节

ES按资源类型统计个数

一.目标:统计各类型资源的个数,输出详细报表 http://10.10.6.225:9200/dsideal_db/t_resource_info/ _mapping {  "properties": {    "RESOURCE_FORMAT": {       "type":     "text",      "fielddata": true    }  }} 返回结果:{ "acknowl

awk----利用循环统计个数

以统计nginx访问日志里面每个ip出现的个数为例 命令如下: awk '{a[$1]++}END{for(j in a) print a[j],j}' /usr/local/nginx/logs/access.log 其中 {a[$1]++}的意思是把$1添加进a这个数组里面,并统计其个数.个人理解,这时候的数组a应该是一个内容对应一个值,例如(192.168.0.1:21,192.168.0.2:54) for(j in a)的意思是把a这个数组的内容赋值给j. print a[j],j}其

poj 3463 最短路与次短路&amp;&amp;统计个数

题意:求最短路和比最短路长度多1的次短路的个数 本来想图(有)方(模)便(版)用spfa的,结果妹纸要我看看dijkstra怎么解.... 写了三遍orz Ver1.0:堆优化+邻接表,WA 1 //不能用堆优化+邻接表,因为需要处理dis[i][0]和dis[i][1]两套,如果都挤到一个堆里就乱套了 2 3 #include <iostream> 4 #include <cstdio> 5 #include <queue> 6 #include <cstrin

[leetcode]题型整理之用bit统计个数

137. Single Number II Given an array of integers, every element appears three times except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 记录32个bit每个bit出现的