博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT甲级——A1049 Counting Ones
阅读量:4540 次
发布时间:2019-06-08

本文共 1702 字,大约阅读时间需要 5 分钟。

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。此时分三种情况进行计算:

1 #include 
2 using namespace std; 3 int main() 4 { 5 int n, ans = 0; 6 cin >> n; 7 int left = n / 10, right = 0, cur = n % 10; 8 for (int i = 1; right != n; i *= 10) 9 {10 ans += left * i + (cur == 0 ? 0 : cur == 1 ? (right + 1) : i);11 right += cur * i;12 cur = left % 10;13 left /= 10;14 }15 cout << ans << endl;16 return 0;17 }

 

 

转载于:https://www.cnblogs.com/zzw1024/p/11276293.html

你可能感兴趣的文章
poj 3744 Scout YYF I (矩阵快速幂)
查看>>
bzoj 2075: [POI2004]KAG
查看>>
python 3 day1(下)
查看>>
调试CS5343总结报告
查看>>
hdu 2586 How far away ? Lca的模板了、、
查看>>
JavaScript筑基篇(二)->JavaScript数据类型
查看>>
Google常用拓展插件
查看>>
一个麻省理工学院毕业生对中国教育的反思
查看>>
Drupal7重置密码方法
查看>>
WEB安全问题
查看>>
C++重载运算符练习--对people类重载“= =”运算符和“=”运算符
查看>>
Nmap命令的实用范例
查看>>
7-1 查找整数编程总结
查看>>
安装PHP以及搭建博客(一)
查看>>
关于WORD文档的读取乱码问题
查看>>
[问题记录.dotnet]取网卡信息报错"找不到"-WMI - Not found
查看>>
Codeforces Round #254 (Div. 2):B. DZY Loves Chemistry
查看>>
删除数据库数据
查看>>
codechef : Marbles 题解
查看>>
突然的明白--public static 类名 函数名()
查看>>