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 (≤230).

Output Specification:

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

Sample Input:

12

Sample Output:

5

Solution

数学

设\(N=d_nd_{n-1}d_{n-2}\cdots d_i \cdots d_2d_1\),对于每一个数位\(d_i\),计算当前数位可能出现1的次数并累加起来即可获得答案。

假设当前位为\(cur \rightarrow d_i\),记其左边的数\(left=d_nd_{n-1}d_{n-2}\cdots d_{i+1}\),右边的数为\(right=d_{i-1} \cdots d_3d_2d_1\)。使用一个变量\(a\)来记录当前位是个位,十位还是百位类推。根据数位的变化规律,有如下结论:

  • \(cur==0\),\(ans+=left*a\)。当高位的数值从\(0\)变换到\(left-1\)时,在\(cur\)位处会出现\(left\)次1,因为对于一个数\(d_nd_{n-1}d_{n-2}\cdots d_i XXXX\)来说,前缀一旦确定,那么\(d_i\)只会在当前前缀的数字下出现一次。但是由于\(cur==0\),所以在以\(left\)为前缀的数中,\(right\)从\(0\)到\(999\cdots\),因此对于一个确定的\(left\),\(d_i\)出现1的次数有\(a\)次,因此一共有\(left*a\)次1出现。
  • \(cur>1\),\(ans+=(left+1)*a\)。由于当前位的值大于1,因此高位的数值可以从\(0\)变换到\(left\),在\(cur\)位处会出现\(left+1\)次\(1\).
  • \(cur==1\),\(ans+=left*a+right+1\),\(left*a\)的来源与\(cur==0\)的情况一致。由于\(cur==1\),因此当左侧前缀\(left\)取到最大时,右侧的后缀的范围不是从0~999...,而是从\(0\)到\(right(d_{i-1} \cdots d_3d_2d_1)\),因此这里还有\(right+1\)个1.
#include<bits/stdc++.h>
long long ans=0; int main(){
int N;
std::cin>>N;
int left=0,right=0,cur=1,a=1;
int ans=0; while(N/a){
left=N/(a*10);
right=N%a;
cur=N/a%10;
if(cur==0) ans+=left*a;
else if(cur==1) ans+=left*a+right+1;
else if(cur>1) ans+=(left+1)*a;
a*=10;
} std::cout<<ans;
return 0;
}

最新文章

  1. AWS系列之二 使用EC2
  2. 移动web开发之屏幕三要素
  3. Asp.net 高性能 Sqlite ORM 框架之 sqliteSugar
  4. 新浪微博客户端(47)-在TextView中插入表情
  5. iOS 8.3 JB ready
  6. [iOS]如何删除工程里面用cocoapods导入的第三方库
  7. 自定义实现简单的Android颜色选择器(附带源码)
  8. 淘宝开源任务调度框架tbschedule
  9. boost参考博客
  10. Pie
  11. oracle 对表的操作
  12. Windows 10 远程桌面出现身份验证错误:要求的函数不受支持(解决)
  13. listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示
  14. php 生成随机字符串
  15. TeamViewer 版本v13.2.26558 修改ID
  16. Vue解决同一页面跳转页面不更新
  17. 使用docker redis-cluster集群搭建
  18. 关于Unity中NGUI的背包实现之Scrollview(基于Camera)
  19. 引用外部jquery.js
  20. SqueezeNet

热门文章

  1. pg到达梦数据迁移常见问题
  2. 调度器30—调度相关结构体—p-&gt;flags
  3. vbox批量管理工具 VirtualBox硬件级虚拟机大众网络版v2019/v2020/v2021 免费版下载地址
  4. 在uniapp中,定义导航栏左侧,右侧按钮
  5. MinGW、Linux GNU、MSVC编译和链接动态库的分析
  6. centos7.2下配置DNS服务器
  7. PMP学习笔记 (一)
  8. 解决QtCreator运行程序报plugin xcb的错误
  9. vue v-if不生效
  10. spring 任务执行器实例