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;
}

【PTA】1049 Counting Ones的更多相关文章

  1. 【51NOD-0】1049 最大子段和

    [算法]DP [题解]开long long…… #include<cstdio> #include<algorithm> #include<cstring> usi ...

  2. 【USACO2017JAN】 Promotion Counting

    [题目链接] 点击打开链接 [算法] 离散化 + dfs + 树状数组 [代码] #include<bits/stdc++.h> using namespace std; #define ...

  3. 【PAT甲级】1049 Counting Ones (30 分)(类似数位DP思想的模拟)

    题意: 输入一个正整数N(N<=2^30),输出从1到N共有多少个数字包括1. AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include& ...

  4. 【hihoCoder】1049.后序遍历

    问题:http://hihocoder.com/problemset/problem/1049?sid=767510 已知一棵二叉树的前序遍历及中序遍历结果,求后序遍历结果 思路: 前序:根-左子树- ...

  5. 【LeetCode】338. Counting Bits (2 solutions)

    Counting Bits Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num  ...

  6. 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...

  7. 【wikioi】1049 棋盘染色(迭代深搜)

    http://www.wikioi.com/problem/1049/ 这题我之前写没想到迭代加深,看了题解,然后学习了这种搜索(之前我写的某题也用过,,但是不懂专业名词 囧.) 迭代加深搜索就是限制 ...

  8. 【USACO17JAN】Promotion Counting晋升者计数 线段树+离散化

    题目描述 The cows have once again tried to form a startup company, failing to remember from past experie ...

  9. 【SP26073】DIVCNT1 - Counting Divisors 题解

    题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...

  10. 【计数】【UVA11401】 Triangle Counting

    传送门 Description 把1……n这n个数中任取3个数,求能组成一个三角形的方案个数 Input 多组数据,对于每组数据,包括: 一行一个数i,代表前i个数. 输入结束标识为i<3. O ...

随机推荐

  1. 【springboot】约定优于配置

    spring的核心思想:约定优于配置 @SpringBootApplication这个注解的本质是有以下三个注解 1.@SpringBootConfiguration 表示该类是一个配置类 2.@En ...

  2. Typora以及Markdown学习

    Typora以及Markdown学习 标题 n级标题 一级标题为#+[空格]+标题或者ctrl+1 二级标题则为``##+[空格]+标题`或者ctrl+2 后续几级标题依此类推... 最多支持6级标题 ...

  3. python之路3:文件操作和函数基础

    文件操作 字符编码解码 函数基础 内置函数 一.文件操作 对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 打开文件的模式有: r,只读模式(默认). w,只写 ...

  4. WPF BackSpace 回退到上一个页面

    在Wpf程序中,有时候点击到某些控件后,再按下[BackSpace]键,画面会回到上一个 TextBox可能自己处理了,所以没有这一个现象. 解决方案是: 在App.xaml.cs 的 Initial ...

  5. 如何使用css绘制三角形

    背景 用迪卡侬官方主页进行页面练习,发现头部导航栏需要使用到梯形 分析 图形分解 通过图片我们可以发现该梯形可以分解成一个长方形和一个直角三角形,长方形:110*65:直角三角形:11*65(底边*另 ...

  6. 修改mysql多个表的相同字段为同一值内容

    mysql将所有数据库的表的相同字段更新为某一值 1.创建存储过程函数名为:proc_update_client_id CREATE PROCEDURE `proc_update_client_id` ...

  7. 1.java 开始

    WelloWorld 随便新建一个文件夹,存放代码 新建一个java文件 编写代码 编译javac java文件,生成一个class文件 运行class文件,java class 可能遇到的情况 每个 ...

  8. 自定义注解+反射提取对象到map中

    一.问题:有时候我们与第三方接口对接传参时,需要将对象里的字段和值以map形式传给别人,此时可以借助其他的工具类,但是我个人用起来不太灵活,还会把多余的字段传给别人,因此我们自己动手搞一套 二.思路: ...

  9. useCallback与useMemo使用场景

    疑问:为什么需要useCallback和useMemo 答: 父组件变化,会引起子组件的 re-render,为了阻止子组件不必要的 re-render,需要满足两个条件: 1.子组件用 react. ...

  10. golang中自带base64编码和解码

    package main import ( "encoding/base64" "fmt" "log" ) func main() { in ...