《编程之美》统计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\n",sum_1(n)); 37 } 38 return 0; 39 }
不懂得尽情问啊~~
-END-
一直地一直地往前走