统计从1~n除去含有‘3’‘8’数字外所有的数字的个数。可以分别统计出每加10,每加100,每加1000...中含有多少个含有数字‘3’‘8’的数字的个数(开头数字为‘3’‘8’的特殊处理),最后全部加起来,再用n减去它,就是1~n不含数字‘3’‘8’的个数。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
long long ipow(int n)
{
long long num = 1;
for(int i = 1; i <= n; i++)
num *= 10;
return num;
}
int main()
{
long long a[11] = {0,2,36,488,5904,67232,737856,7902848,83222784,865782272};
char b[10];
long long num, cct;
while(scanf("%I64d", &num), num)
{
cct = 0;
sprintf(b,"%I64d",num);
int len = strlen(b);
for(int j = 0; j < len; j++)
{
if(b[j] >= '3')
cct += ipow(len-j-1);
if(b[j] >= '8')
cct += ipow(len-j-1);
if(b[j] >= '3'&&b[j]<'8')
cct += (b[j] - '0' - 1) * a[len-j-1];
else if(b[j] >= '8')
cct += (b[j] - '0' - 2) * a[len-j-1];
else
cct += (b[j] - '0') * a[len-j-1];
}
printf("%I64d: %I64d\n", num, num-cct);
}
return 0;
}