POJ 3286 How many 0's?(几多0?)
POJ 3286 How many 0's?(几多0?)
Time Limit: 1000MS Memory Limit: 65536K
|
【Description】 |
【题目描述】 |
|
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? |
一个本尼迪克16号僧侣写下m与n之间并且包括mn的所有十进制自然数,m ≤ n。这之间他写下了多少个0? |
|
【Input】 |
【输入】 |
|
Input consists of a sequence of lines. Each line contains two unsigned 32-bit integers m and n, m ≤ n. The last line of input has the value of m negative and this line should not be processed. |
多组输入。每行有两个无符号32位整数m和n,m ≤ n。最后一行的m是负数,因此不该被执行。 |
|
【Output】 |
【输出】 |
|
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. |
对于每行输入数据输出一行一个整数,表示这个僧侣写了多少个0. |
|
【Sample Input - 输入样例】 |
【Sample Output - 输出样例】 |
|
10 11 100 200 0 500 1234567890 2345678901 0 4294967295 -1 -1 |
1 22 92 987654304 3825876150 |
【题解】
如果不考虑数据范围,这道题应该就是入门级别的数位DP(此处可参考HDU 2089)
不过这道的数据范围是unsigned int,无符号减法可能有问题,所以还是直接上int64吧。
这道题在具体的思路上基本一致,因为数据范围大了,就需要压缩一下空间,不能任性。
之后的计算方式大概可以变为:
计算0~N写了几个0,即个位上0写的次数,十位上0…,百位上的0…以此类推。
每一位按照其出现0的区间间隔与区间长度,计算这一位上写了几次0。
|
百位 |
[1000, 1099] |
[2000, 2099] |
[3000, 3099] |
[4000, 4099] |
…… |
|
十位 |
[100, 109] |
[200, 209] |
[300, 309] |
[400, 409] |
…… |
|
个位 |
[0, 0] |
[10, 10] |
[20, 20] |
[30, 30] |
…… |
以100为例:
个位:直接100/10 +1 = 11(懒)。
十位:100拆分成1 00
其中1表示进位的次数,完整区间数1-0=1,剩余区间的元素个数 0–0+1=1。
所以十位数的次数=0*10+1 = 1。
百位:到达最高位,结束。
结果:11+1 = 12。
以200为例:
个位:20 0,200/10 +1 = 21。
十位:2 10,完整区间数2-1=1,剩余区间的元素个数0-0+1=10。
剩余10>9,所以超过9的元素最多只能提供10个0
十位数的次数=1*10+10 = 11。
百位:结束。
结果:21+11 = 32。
其他数字的结果以此类推,就能计算0~N写了几个0。
【代码 C++】
#include<cstdio>
__int64 cmp[];
void rdy(){
int i;
for (cmp[] = i = ; i < ; ++i) cmp[i] = cmp[i - ] * ;
}
__int64 calculate(__int64 now){
if (now < ) return ;
int i = ;
__int64 right, left, opt = now / + ;
while (){
left = now / (cmp[i + ]);
right = now % (cmp[i + ]);
if (right < now){
opt += (left - )*(cmp[i]);
if (right >= cmp[i]) opt += cmp[i];
else opt += right + ;
++i;
}
else break;
}
return opt;
}
int main(){
rdy();
__int64 a, b;
while (scanf("%I64d%I64d", &a, &b)){
if (a < ) return ;
printf("%I64d\n", calculate(b) - calculate(a - ));
}
return ;
}
POJ 3286 How many 0's?(几多0?)的更多相关文章
- POJ 3286 How many 0's?
题目链接 题意 :写下m到n之间所有的数,会写多少个0. 思路 :先算0到m的,再算0到n的,最后相减. 网上有位大神是这么推的,看下面.... 首先转化成求 [0, x] 中所有数中,含有的 0 的 ...
- POJ 1979 Red and Black dfs 难度:0
http://poj.org/problem?id=1979 #include <cstdio> #include <cstring> using namespace std; ...
- poj 1789 Truck History 最小生成树 prim 难度:0
Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19122 Accepted: 7366 De ...
- 创建或打开解决方案时提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案
提示"DotNetCore.1.0.1-SDK.1.0.0.Preview2-003131-x86"错误的解决方案: 1.检查是否有C:\Program Files (x86)\d ...
- Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决办法
今天在导入工程进Eclipse的时候竟然出错了,控制台输出的是: [2013-02-04 22:17:13 - takepicture] Android requires compiler compl ...
- 字符串数组初始化0 与memset 0 效率的分析
转自:http://www.xuebuyuan.com/1722207.html 结合http://blog.sina.com.cn/s/blog_59d470310100gov8.html来看. 最 ...
- bootstrap2.0与3.0的区别
在阅读这篇bootstrap2.0与3.0的区别的文章之前,大家一定要先了解什么是响应式网站设计?推荐大家看看这篇"教你快速了解响应式网站设计" . 我觉得bootstrap的可视 ...
- centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解
centos7.2环境elasticsearch-5.0.1+kibana-5.0.1+zookeeper3.4.6+kafka_2.9.2-0.8.2.1部署详解 环境准备: 操作系统:centos ...
- ASP.Net MVC3安全升级导致程序集从3.0.0.0变为3.0.0.1
开发环境一般引用的是本机 C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies下的System.Web.Mvc.dll,当 ...
随机推荐
- JavaScript:九种弹出对话框
[1.最基本的js弹出对话框窗口代码] 这是最基本的js弹出对话框,其实代码就几句非常简单: <script LANGUAGE="javascript"> <!- ...
- 【jqGrid for ASP.NET MVC Documentation】.学习笔记.7.搜索过滤数据
1 基础 搜索和过滤功能,是使用确定的条件,查找匹配行数据.jqGrid提供几种搜索模式: Search Dialog 单搜索选项 Search Dialog 多搜索选项 ToolBar Search ...
- socket的心跳包机制
网络中的接收和发送数据都是使用操作系统中的SOCKET进行实现.但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题.可是如何判断这个套接字是否还可以使用呢?这个就需要在系统中创建心跳机 ...
- C#:IText构造PDF文件
IText构造PDF文件 1.1 生成Document Document是我们要生成的PDF文件所有元素的容器,因此要生成一个PDF文档,必须首先定义一个Document对象. Document有三种 ...
- JS获取非行间样式
我们都知道用offset函数获取元素样式是一件很方便的事,但是offset只能获取行间样式,而无法获得非行间样式,这是它的瓶颈所在. 我们都知道js获取行间样式的方法,那么js是如何获取行距样式的呢? ...
- C/C++ 调用qsort/sort 对字符数组排序的cmp函数写法
这个问题屡次碰到解决之后再次遇到又忘记怎么弄了,这次打算彻底搞清楚. ·C 首先对所谓字符数组的排序应该是对(char)*a[]数组而非(char)a[][]进行的排序,后者是无法直接调用qsort实 ...
- 花40分钟写一个-CBIR引擎-代码公开
浏览网页的时候发现一篇不错的文章"用Python和OpenCV创建一个图片搜索引擎的完整指南"http://python.jobbole.com/80860/.作者在浏 ...
- LTE切换与TAU问题
假如有两个LTE基站A B(同频组网) AB TAC不同 且添加了双向邻区关系 现终端开机重选至A然后往B方向移动 是先切换呢?还是先进性TAU更新 这个没有影响,,TAU并非需要在IDLE状态下才能 ...
- JAVA基础知识之JVM-——反射和泛型
泛型和Class类 在反射中使用泛型Class<T>可以避免强制类型转换,下面是一个简单例子,如果不使用泛型的话,需要显示转换, package aop; import java.util ...
- Unix网络编程--卷二:进程间通信
Unix网络编程--卷二:进程间通信 本书是一部Unix网络编程的经典之作!进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机网络应用程序的必要条件.本书从对Po ...