码迷,mamicode.com
首页 > 其他好文 > 详细

51 Nod 1009 数字1的数量(数位dp)

时间:2017-11-02 22:03:18      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:target   online   bsp   ace   tps   十进制   main   turn   次数   

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009

题目:

给定一个十进制正整数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出现的次数。每个数位上数字分=0,=1,>1,三种情况讨论。
举个栗子:假设我们要计算百位上1出现的次数。
1.=0,出现1的可能性只由更高位决定。比如12013,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,共1200个。等于更高位数字乘以当前位数,即12 * 100。
2.=1,出现1的可能性由更高位和低位决定。比如12113,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12113,即12*100+13+1。
3.>1,出现1的可能性只由更高位决定。比如12213,百位出现1的情况为100~199,1100~1199,2100~2199,…,11100~11199,12100~12199,即(12+1)*100。
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 int main(){
 6     int m,n,mul=1;
 7     long long ans=0;
 8     cin>>n;
 9     int t=n;
10     while(t){
11         m=t%10;
12         if(m==0)  ans+=n/(mul*10)*mul;
13         else if(m==1){
14             ans+=n/(mul*10)*mul;
15             ans+=(n%mul)+1;
16             cout<<"YY = "<<n/(mul*10)*mul+(n%mul)+1<<endl;
17         }
18         else ans+=(n/(mul*10)+1)*mul;
19         mul*=10;
20         t/=10;
21     }
22     cout<<ans<<endl;
23     return 0;
24 }

 




51 Nod 1009 数字1的数量(数位dp)

标签:target   online   bsp   ace   tps   十进制   main   turn   次数   

原文地址:http://www.cnblogs.com/Leonard-/p/7774567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!