要求出a,b两个数中1出现的次数,可以先求出大者出现的1 的个数,然后求出小者1出现的个数,两者相减即可。以0,197为例
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100
101 102 103 104 105 106 107 108 109 110
111 112 113 114 115 116 117 118 119 120
121 122 123 124 125 126 127 128 129 130
131 132 133 134 135 136 137 138 139 140
141 142 143 144 145 146 147 148 149 150
151 152 153 154 155 156 157 158 159 160
161 162 163 164 165 166 167 168 169 170
171 172 173 174 175 176 177 178 179 180
181 182 183 184 185 186 187 188 189 190
191 192 193 194 195 196 197
可以分别求出1 在190 到197之间出现的次数,然后求出1到189中每个数个位出现的次数。
在个位考虑完成后,直接考虑197/10-1中1出现的个数,考虑到数字减少一位,相应的权值就会增加10倍。重复以上步骤可以求出解。
#include<stdio.h>
int d[10];
int value;
void acount(int n){
int i;
int one,ten;
if(n<=0) return;
one = n%10;
ten = n/10;
n/=10;
for(i = 0;i<=one ;i++) d[i] += value; //求出190到197出现的
while(ten){
d[ten%10] += (one +1)*value;
ten/=10; //次数
}
for(i = 0;i<10;i++) d[i] += value *n; //求出0-189中每个数字个位出现1的次数。
d[0] -= value; //对于零出现的次数特殊处理。
value *= 10;
acount(n-1);
}
int main(){
int a,b;
int i;
while(scanf("%d%d",&a,&b)!=EOF){
if(a == 0 && b==0) break;
if(a<b){int temp = a;a = b;b = temp;}
for(i = 0;i<10;i++) d[i] = 0;
value = 1;
acount(a);
value = -1;
acount(b-1);
printf("%d\n",d[1]);
}
return 0;
}