hdu 4278 Faulty Odometer YY题目

http://acm.hdu.edu.cn/showproblem.php?pid=4278

题意:

一个特殊的汽车行程计数器,当每个位出现3或者8时直接跳到下一位;

0 1 2 4 5 6 7 9 

10 11 12 14 15 16 17 19 

20 21 22 24 25 26 27 29

......

思路:

YY发现其实可以映射到8进制数,(0 - 9)表示10进制数,将(0 1 2 4 5 6 7 9 )映射到(0 - 8)其实就是8进制的表示。

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>

#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x)  ((x) > 0 ? (x) : -(x))
#define Min(a,b) (a) > (b)? (b):(a)
#define Max(a,b) (a) > (b)? (a):(b)

#define ll long long
#define inf 0x7f7f7f7f
#define MOD 100000007
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define test puts("<------------------->")
#define maxn 100007
#define M 100007
#define N 50007
using namespace std;
//freopen("din.txt","r",stdin);

int find(char ch){
    int a = ch - '0';
    if (a >= 3 && a < 8) a--;
    else if (a >= 8) a -= 2;
    return a;
}
int Pow(int x){
    int sum = 1,i;
    for (i = 1; i <= x; ++i) sum *= 8;
    return sum;
}
int solve(char *s){
    int i,j;
    int len = strlen(s);
    int num = 0;
    for (i = len - 1,j = 0; i >= 0 && j < len; --i,++j){
        int x = find(s[i]);// 关键是将0-9映射
        num += x*Pow(j);//转化成8进制 
    }
    return num;
}
int main(){
    //freopen("din.txt","r",stdin);
    char str[12];
    while (scanf("%s",str)){
        if (str[0] == '0') break;
        printf("%s: %d\n",str,solve(str));
    }
    return 0;
}

 

 

posted @ 2012-09-11 22:51  E_star  阅读(199)  评论(0编辑  收藏  举报