Faulty Odometer

其实这是一个很简单的数学规律题,只要想明白每次跳变会会少多少个数就差不多能出解了,比如个位上2~4少1个数,7~9又少一个数,十位数29~40少了10个数那么,再如299-400少了100个数,那么反观来看,就变成进制问题,因为每一位都会发生两次跳变,那么也就从十进制变成了八进制,这样把每一位的数字按八进制来算即可出解。

#include<cstdio>
#include<cstdlib>
#include<cstring>

using namespace std;

int p(int a,int b){
    int ans=1;
    for(int i=1;i<=b;i++)ans*=a;
    return ans;
}
int main(){
      char str[15];
      while(scanf("%s",str)&&str[0]!='0'){
           int len=strlen(str);
           int ans=0;
           for(int i=0;i<len;i++){
                if(str[i]>='3'&&str[i]<='7')ans+=(str[i]-'1')*p(8,len-1-i);
                else if(str[i]>'7')ans+=(str[i]-'2')*p(8,len-1-i);
                else ans+=(str[i]-'0')*p(8,len-1-i);
           }
           printf("%s: %d\n",str,ans);
      }
      return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值