《编程之美》统计1的个数

今天看了《入门经典》上的一道题,打算来存个统计位数的模板,一般都是用数位dp来做,但统计单个数字可以特殊处理。


题目:对1~n统计1个数。

题目简单,分析可以看: 

从0开始到某个数N有点多少个1——编程之美2.4

举个例子:

对于一个数abcde,取百位上的c来计算,
假若c是"1",那么百位上1的个数是由他的高位和低位来决定的。等于ab*100+cde+1;
假若c是"0",那么百位上1的个数是ab*100;
假如c是大于1,那么 百位上1的个数是(ab+1)*100


然后就上代码了:

 1 #include<cstdio>
 2 #define LL long long 
 3 
 4 LL n,count;
 5 
 6 LL sum_1(LL n)
 7 {
 8     count=0;
 9     LL factor=1,lownum=0,curnum=0,highnum=0;
10     while(n/factor)//从低到高 
11     {
12         lownum=n-(n/factor)*factor;//低位数字 
13         curnum=(n/factor)%10;//当前位数字 
14         highnum=n/(factor*10);//高位数字 
15         switch(curnum)
16         {
17             case 0:
18                 count+=highnum*factor;
19                 break;
20             case 1:
21                 count+=highnum*factor+lownum+1;
22                 break;
23             default:
24                 count+=(highnum+1)*factor;
25                 break;    
26         }
27         factor*=10;//位数升高 
28     }
29     return count;
30 }
31 
32 int main() 
33 {
34     for(;scanf("%lld",&n)!=EOF;)
35     {
36         printf("count=%lld
",sum_1(n));
37     }
38     return 0;
39 }
View Code

不懂得尽情问啊~~

-END-

原文地址:https://www.cnblogs.com/chendl111/p/5688594.html