hdu4278 Faulty Odometer(反常规则水题--八进制)

 

题目链接:

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

 

题目描述:

1)一个损坏的里程表,计数时会自动跳过3和8,其他正常;

2)给出里程表的示数,求实际的里程数;

 

题目分析:

1)这个题刚开始我的错误思路:

分别每位求跳过多少次,比如说在150在十位上跳过3次,因为3_,8_,13_各跳过一次,     

最后需要在总数150中减去3x10,但这样做是不可行的,因为低位上的需要用到高位上

的跳过数,而前一位的跳过数又和前前位有关,搅在一起混乱了(后来证明这个想法

有问题,因为后面是每八位进1,所以每次多跳过得乘以8^n,这样八进制和十进制搅

在一起,彻底分不清了)。

2)之后通过列举发现是八进制:

当捋不清思路和情况混乱时,总有一个办法,那就是列举找规律,我一下从1列举到了

150,结果却发现每十个数次跳过2个数,每次只走8个就进位了,很规整的8进制嘛,

然后思路出来了:分别对每位计算实际进了多少位(即:设该位为数字x,若x<3,算

为x;若3<x<8,算为x-1;若x>8,算为x-2;),然后把它当成八进制数转化成十进制

即可,0MS;

 

题目程序:

#include <cstring>
#include <cstdio>

int arr[12];
int main()
{
    int i,k,num,num0,jin,sum;
    while(~scanf("%d",&num))
    {
        if(!num) break;
        num0=num;
        
        memset(arr,0,sizeof(arr));
        k=0;
        jin=1;
        sum=0;
        while(num!=0)
        {
            arr[k]=num%10;
            if(arr[k]<3)
                sum+=arr[k]*jin;
            else if(arr[k]<8)
                sum+=(arr[k]-1)*jin;
            else
                sum+=(arr[k]-2)*jin;
            
            jin*=8;
            num/=10;
            k++;
        }
        printf("%d: %d\n",num0,sum);
    }
    return 0;
}


 

posted on 2013-09-03 08:02  Gddxz  阅读(306)  评论(0编辑  收藏  举报

导航