计数问题
统计[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 }