51 nod 1009 数字1的数量
2016-07-28 14:43
337 查看
1009 数字1的数量
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5
思路:
去计算每个位置上1出现的次数!这个次数与这个位置上的数字和前后的数字有关系。想清楚就好了。
假设N,我们要计算百位上出现1的次数,将由三部分决定:百位上的数字,百位以上的数字,百位一下的数字。
如果百位上的数字为0,则百位上出现1的次数仅由更高位决定,
比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。
等于更高位数字乘以当前位数,即12 * 100。
如果百位上的数字大于1,则百位上出现1的次数仅由更高位决定,比如12213,
百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300个。
等于更高位数字加1乘以当前位数,即(12 + 1)*100。
如果百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。例如12113,
受高位影响出现1的情况:100~199,1100~1199,2100~2199,…,11100~11199,共1200个,但它还受低位影响,
出现1的情况是12100~12113,共114个,等于低位数字113+1。
基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数。
例如:n = 12,包含了5个1。1,10,12共包含3个1,11包含2个1,总共5个1。
Input
输入N(1 <= N <= 10^9)
Output
输出包含1的个数
Input示例
12
Output示例
5
思路:
去计算每个位置上1出现的次数!这个次数与这个位置上的数字和前后的数字有关系。想清楚就好了。
假设N,我们要计算百位上出现1的次数,将由三部分决定:百位上的数字,百位以上的数字,百位一下的数字。
如果百位上的数字为0,则百位上出现1的次数仅由更高位决定,
比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。
等于更高位数字乘以当前位数,即12 * 100。
如果百位上的数字大于1,则百位上出现1的次数仅由更高位决定,比如12213,
百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199共1300个。
等于更高位数字加1乘以当前位数,即(12 + 1)*100。
如果百位上的数字为1,则百位上出现1的次数不仅受更高位影响,还受低位影响。例如12113,
受高位影响出现1的情况:100~199,1100~1199,2100~2199,…,11100~11199,共1200个,但它还受低位影响,
出现1的情况是12100~12113,共114个,等于低位数字113+1。
#include <iostream> #include <cstdio> #include <map> #include <set> #include <vector> #include <queue> #include <stack> #include <cmath> #include <algorithm> #include <cstring> #include <string> using namespace std; #define INF 0x3f3f3f3f typedef long long LL; int CountOne(int n) { int cnt = 0; int i = 1; int current = 0, after = 0, before = 0; while ((n / i) != 0) { current = (n / i) % 10;//当前的数 before = n / (i * 10);//前面的数 after = n - (n / i) * i;//后面的数 if (current > 1) cnt = cnt + (before + 1) * i; else if (current == 0) cnt = cnt + before * i; else if (current == 1) cnt = cnt + before * i + after + 1; i = i * 10; } return cnt; } int main() { int n; while(cin>>n){ int res=CountOne(n); cout<<res<<endl; } return 0; }
相关文章推荐
- 平衡二叉树 待续
- Blockchian区块链:IBM HyperLedger fabric 简述
- 20160728
- webSocket在微信中崩溃的解决方案
- Eclipse和Android Studio的偏好设置的导出和导入
- 二分查找的递归和非递归实现
- 在自定义collectionview的flowlayout的时候控制台报错解决方
- oracle中怎样查询用户权限
- docker 端口映射不成功。解决方法
- jrebel在Myeclipse中的使用
- <poj - 3268> Silver Cow Party 牛のpart 最短路径问题
- iOS开发--浅谈CocoaAsyncSocket编程
- android学习摘记——通过adb工具查看sqlite3数据库
- win7 64+caffe+cuda+cudnn(个人日记)
- ROS--python遇到的错误
- Android开发笔记(二)常见的正则校验—持续收录中
- 安卓获取顶层应用的包名
- 常用排序算法--插入排序解读
- jdk1.5、1.6、1.7新特性详细介绍(整理)
- 源码分析之最近算法