计数问题

统计[a,b]之间1出现的次数

 1 #include<iostream>
 2 using namespace std ;
 3 /***************************/
 4 const int N = 11 ;
 5 int d[N] ;                    //d[N]中存储数字0--9分别出现的次数 
 6 int value ;                   //记录相应的权值变化 
 7 void deal(int n) ;
 8 /**************************/
 9 void deal(int n)
10 {
11     if(n<=0)
12         return  ;
13     
14     int one, ten ;            //one、ten分别表示个位和十位 
15     one = n % 10 ;
16     n/=10 ;
17     ten = n ;
18     
19     for(int i=0; i<=one; i++)     //将个位上出现的数统计下来 
20         d[i] += value ;
21     
22     while(ten)
23     {
24         d[ten%10] += (one+1) * value ;
25         ten /= 10 ; 
26     }
27     
28     for(int i=0; i<10; i++)
29         d[i] += value * n ;
30     
31     d[0] -= value ;               //将第一位是0的情况排除 
32     value *= 10 ;                 //权值变化,变为原来的十倍 
33     deal(n-1) ;
34     
35 }
36  
37 /****************************/
38 
39 int main()
40 {
41     int a, b ;
42     
43     while(cin>>a>>b)
44     {
45         if(a==0&&b==0)
46             break ;
47         if(a<b) 
48         {
49             int tmp = b ;
50             b = a ;             //将较大值存入a中,较小值存入b中 
51             a = tmp ;
52          } 
53          
54         for(int i=0; i<10; i++)   //初始化操作 
55             d[i] = 0 ;
56         
57         value = 1 ;
58         deal(a) ;
59         value = -1 ;         //此处value=-1是为了求出最后的答案deal(a)-deal(b) 
60         deal(b-1) ;
61         
62         /*输出结果*/
63         cout<<d[1]<<endl ;
64     }
65     
66     //system("pause") ;    
67     return 0 ;
68 }

 

posted @ 2018-09-13 13:23  Hello'world  阅读(251)  评论(0编辑  收藏  举报