uva 11038

Problem E: How many 0‘s?

A Benedict monk No. 16 writes down the decimal representations of all natural numbers between and including m and nm ≤ n. How many 0‘s will he write down?

Input consists of a sequence of lines. Each line contains two unsigned 32-bit integers m and nm ≤ n. The last line of input has the value of mnegative and this line should not be processed.

For each line of input print one line of output with one integer number giving the number of 0‘s written down by the monk.

Sample input

10 11
100 200
0 500
1234567890 2345678901
0 4294967295
-1 -1

Output for sample input

1
22
92

大意:

给出若干区间 [L, R] 求出将 L~ R 之间的数全部写出来要用多少个 ‘0‘ ?

思路:

数学特别渣....于是决定现在开始版切掉 lrj 的数学专题....

第一个思想就是采用减法间接计算, 不直接计算.

第二个思想就是分类统计....

  把这个数字分开成三段考虑.

  left, i, right. (left != 0)

  如果 i >= 0, 那么不难想到, 这一位上的 0 出现了 10right.len * left 次.(len 表示 right 有几位)

  如果 i == 0, 那么第 i 位的贡献是: 10right.len * (left - 1) + right 次.

  由于不同的位上互不影响,所以用加法原理加起来就 ok 了.

代码应该还能精简一点.

 1 #include<cstdlib>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<iostream>
 5 using namespace std;
 6 typedef long long ll;
 7 ll n,m;
 8 ll ans(ll x){
 9     ll t = 1,cnt = 0,tmp = x;
10     while(tmp){
11         cnt += max((x / (t * 10) - (tmp % 10 == 0)) * t,0LL);
12         if(tmp % 10 == 0) cnt += x % t + 1;
13         t *= 10, tmp /= 10;
14     }
15     return cnt;
16 }
17 int main()
18 {
19     freopen("0.in","r",stdin);
20     freopen("0.out","w",stdout);
21     while(cin >> n >> m, m > 0){
22         ll a = ans(m), b = ans(n-1), c = n == 0;
23         cout << a - b + c << endl;
24     }
25     return 0;
26 }

时间: 2024-11-03 05:10:59

uva 11038的相关文章

uva 11038 - How Many O&#39;s?(计数问题)

题目链接:uva 11038 - How Many O's? 题目大意:写出m到n之间的数,问需要写多少个0. 解题思路:f(x)表示从0到x需要写多少个0,于是给出区间[m,n]就有答案等于f(n)-f(m-1).剩下的就是f(x)该如何求.枚举每个位置上可能为0的情况,这样就将这个数分成两个部分,在保证组成的数小于x的前提下,计算可以的组成方法. 例:x=12345,枚举十位为0的情况,因为x的十位为4,所以十位以前的百位.千位.万位组成的数可以是0~123,然后个位可以是0~9,这样组成的

UVA 11038 - How Many O&#39;s?(计数问题)

题目链接:11038 - How Many O's? 题意:求[a.b]之间,0出现的次数. 思路:一开始一直往数位DP上去想,结果发现挺复杂的.. 把问题先转化为求0 - num的个数,在用到b的个数减去到a的个数 其实只要利用计数的乘法和加法原理,把数字对应的每一位的分成左右两边,利用乘法原理求总数,在用加法原理把所有的总数加起来就是总情况数.那么讨论一下分成两边的情况.举个例子 比如23045 设中间位为mid,如果mid不为0,假如求到4这个位,那么左边的情况就有[1-230]种情况,而

UVA - 11038 How Many O&#39;s? (计数)

Description Problem E: How many 0's? A Benedict monk No. 16 writes down the decimal representations of all natural numbers between and including m and n, m ≤ n. How many 0's will he write down? Input consists of a sequence of lines. Each line contain

UVA 11038 - How Many O&#39;s? 计算对答案的贡献

题意: 求[n, m]之间包含0的数字的个数题解:转化为求solve(n) - solve(m-1)的前缀问题 对于求0到n的解,我们举例 n = 25789 对于8这位,让其为0对答案的贡献是 (0~257)*(0~9) 假设是 n = 25709 那么让这位为0的答案贡献是 (0~256) * (0~9) + (257)* (0~9) //meek///#include<bits/stdc++.h> #include <cstdio> #include <cmath>

UVA - 11038 How Many O&#39;s? (数位dp)

How Many O's? 题意是求区间内数字中0的个数,比如100就有两个0. 数位dp吧,dp[i][j][k], i很明显表示当前位置,j表示找到的0的个数,k表示要找的0的个数.因为数字里0的个数最多32个,所以可以枚举32种k的情况,用数位dp去找. #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; #

How Many O&#39;s? UVA - 11038

这个题个人感觉有点难,不容易理解. 题意 给你两个数,n,m,找出从n到m所有的数一共包含几个0,看似简单,包含0的不就都是整数么,然后就用暴力循环来找,绝对TL.我自己写这题也没有什么好的办法,没有头绪,也是听别人讲的才明白这个方法,确实厉害. 剥离锁位(名字什么随便起的,下面代码思路及注释) #include<iostream> #include<stdio.h> #include<string.h> using namespace std; typedef lon

uva 11645 - Bits(计数问题+高精度)

题目链接:uva 11645 - Bits 题目大意:给出n,问从0到n这n+1个数种,数的二进制情况下,有多少11存在. 解题思路:和uva 11038一个类型的题目,只是这道题目是对于二进制下的情况.而且高精度部分可以用两个long long数解决. #include <cstdio> #include <cstring> typedef long long ll; const int N = 100; const ll M = 1e13; ll bit (int k) { r

uva 11645

Problem JBits Input: Standard Input Output: Standard Output A bit is a binary digit, taking a logical value of either "1" or "0" (also referred to as "true" or "false" respectively).  And every decimal number has a

UVA 11645 - Bits(数论+计数问题)

题目链接:11645 - Bits 题意:给定一个数字n.要求0-n的二进制形式下,连续11的个数. 思路:和?UVA 11038?这题相似,枚举中间,然后处理两边的情况. 只是本题最大的答案会超过longlong,要用高精度,只是借鉴http://www.cnblogs.com/TO-Asia/p/3214706.html这个人的方法,直接用两个数字来保存一个数字.这样能保存到2个longlong的长度,就足够存放这题的答案了. 代码: #include <stdio.h> #include