题目链接:
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;
}