题意:找出小于等于一个数的所有不含3和8的数有多少个。
思路:为了方便,在求解的时候先把0带上。在输出结果的时候减一就好了。个位数不含3和8的有8个,两位数有8*8个,因为两位数中,十位可以有除了3,8以外的8个数(0,1,2,4,5,6,7,9),每个打头的都有8个,所以是8*8。以此类推。计算小于等于n的符合要求的有多少个的时候,先计算最高位小于n的最高位的有多少个,再计算最高位等于n的最高位的有多少个。
代码如下:
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <string>
#include <queue>
#include <bitset>
#include<assert.h>
using namespace std;
int dp[20];
int cnt[]={1,2,3,3,4,5,6,7,7,8};
int mod[]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
int getlen(int n){
int ret=0;
while(n){
ret++;
n/=10;
}
return ret;
}
int solve(int n)
{
if(n==0)return 1;
int len=getlen(n);
int top=n/mod[len];
int ans=cnt[top-1]*dp[len-1];
ans+=solve(n%mod[len]);
return ans;
}
int main()
{
// freopen("data.txt","r",stdin);
dp[0]=1;
dp[1] = 8;
for(int i=2;i<=10;++i){
dp[i]=8*dp[i-1];
}
int n;
while(scanf("%d",&n)!=EOF&&n){
printf("%d: %d\n",n,solve(n)-1);
}
return 0;
}