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; }