您的位置:首页 > 其它

hdu 4278——Faulty Odometer

2015-07-24 15:07 344 查看
题意:找出小于等于一个数的所有不含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的最高位的有多少个。

代码如下:

[code]#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: