The task is simple: given any positive integer N, you are supposed to count the total number of 1's in the decimal form of the integers from 1 to N. For example, given N being 12, there are five 1's in 1, 10, 11, and 12.

Input Specification:

Each input file contains one test case which gives the positive N (≤).

Output Specification:

For each test case, print the number of 1's in one line.

Sample Input:

12

Sample Output:

5

显然暴力枚举的方法是不可取的,我们需要寻找其中的规律,本题中可以分别计算出每一位的1出现的个数再进行加和。本博客中以数字N=345、N=305、N=315为例,寻找十位数字上是1的数字个数。将数字分成3部分:百位、十位、各位。
显然,从1~345这345个数中,百位数字可以出现0、1、2、3四种,每种百位数字都可以跟一个数字为1的十位,而每种十位数字可以跟0~9这十种数字,所以从1~345这345个数中,十位数字为1的数共有(3+1)×10=40 (3+1)×10=40(3+1)×10=40个,故十位上的1共出现40次。
当N=305时,百位数字依然可以出现0、1、2、3四种,但要注意,百位数字为3时,后面不能再跟数字为1的十位,因为这样的数字已经大于305了,所以从1~305这305个数中,十位数字为1的数共有3×10=30 3×10=303×10=30个,故十位上的1共出现30次。
当N=315时,百位数字依然可以出现0、1、2、3四种,此时要注意,百位数字为3时,后面可以再跟数字为1的十位,但这样的数字个位上只能出现0~5这6个数,即310、311、312、313、314、315,其他数字都会大于315,所以从1~315这315个数中,十位数字为1的数共有3×10+(5+1)=36 3×10+(5+1)=363×10+(5+1)=36个,故十位上的1共出现36次。

综上,对于任意一个数字N,当要判断从右向左数第i位上1出现的次数num时,可以将这个数字分成三部分,分别用left、current、right表示,即left=数字N在i位左侧的数字、current=数字N在第i位的数字、right=数字N在i位右侧的数字。例如数字N=123456,判断从右向左第2位也就是百位上,即数字4所在位置1出现的次数时,left=123、current=4、right=56。此时分三种情况进行计算:

 #include <iostream>
using namespace std;
int main()
{
int n, ans = ;
cin >> n;
int left = n / , right = , cur = n % ;
for (int i = ; right != n; i *= )
{
ans += left * i + (cur == ? : cur == ? (right + ) : i);
right += cur * i;
cur = left % ;
left /= ;
}
cout << ans << endl;
return ;
}

最新文章

  1. Android开发输入法遮盖屏幕底部按钮
  2. 将ubuntu的id_rsa秘钥转为putty的ppk格式
  3. 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)
  4. c++构造函数谁先执行的问题
  5. iOS常用的加密方式--备用
  6. Visual Studio创建跨平台移动应用_03.AppBuilder Extension
  7. vagrant 配置文件简析
  8. 64位调试器花费的时间比预期的要长(A 64-bit debugging operation is taking longer than expected)
  9. 在web浏览器中判断app是否安装并直接打开
  10. Java IO(IO流)-1
  11. [置顶] Xamarin Android安装教程(2016最新亲测安装版)
  12. Spring定时任务(一):SpringTask使用
  13. https处理的一个过程,对称加密和非对称加密
  14. Python环境——安装扩展库
  15. ASP.NET EF 延迟加载,导航属性延迟加载
  16. POJ 1330 Nearest Common Ancestors (模板题)【LCA】
  17. hive sqoop,sqoop-hive import data
  18. java_13.1 javaAPI
  19. HDU 1421 搬寝室(经典DP,值得经常回顾)
  20. LintCode: Single Number

热门文章

  1. 云-腾讯云-短信:短信(SMS)
  2. yolo自己的数据集中LabelImg的安装出现No module named &#39;libs.resources&#39;错误
  3. django2 rest_framework + vue.js + mysql5.6 实现增删改查
  4. CSS 常用的兼容性调试技巧
  5. USACO 2003 Fall Orange Cow Exhibition /// 负数01背包 oj22829
  6. Spring JdbcTemplate详解(9)
  7. Java多线程设计模式系列
  8. Python 字符串切片(slice)
  9. 图片上传的ImageIO工具类
  10. Luogu P1041 传染病控制(搜索)