题目
某辆汽车有一个里程表,该里程表可以显示一个整数,为该车走过的公里数。然而这个里程表有个毛病:它总是从2变到4,而跳过数字3;从7变到9,而跳过数字8,里程表所有位(个位、 十位、百位等)上的数字都是如此。例如,如果里程表显示29,汽车走过1公里之后,该里程表显示40,但实际应该是30。
6 //这个表示输入行数
0
1
12
159
111224459
124567976
- 1
- 2
- 3
- 4
- 5
- 6
- 7
0
1
10
103
19212007
21913077
- 1
- 2
- 3
- 4
- 5
- 6
解题:
在数数的时候,我们正常从1数到10
,之后11,这样是十进制
。现在这个里程表,有两个数不显示,其实相当于当我们数到10
的时候,其实只有1,2,4,5,6,7,9,10
这8个数字,在这种情况下其实是8进制
。
所以,我们现在把显示的里程数,转成10进制即可,但要注意的是,我们数数的时候是直接丢掉了两个数,所以要判断当前某位上的数实际是多大。
比如假设显示 5
,那么3 < 5 < 8
的,所以实际只有4
个数(5-1)
;
比如假设显示 9
,那么9>3 ,9>8
的,所以实际只有7
个数(9-2)
;
显示的里程数其实是8进制。逢8进1
function getOriginNum(x){
//没有3和8
var s = x;
if(x>3) s--; //少一个数,就少数一个
if(x>8) s--; //比如数到9,其实只有7个数
return s;
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
import java.lang.Math.*;
public class Main {
public static int getAns(int num){
int ans=0,j=0;
while(num>0){
int x=num%10;
if(x>4) x--;
ans+=x*Math.pow(9,j);//9进制转换为10进制
j++;
num/=10;
}
return ans;
}
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(System.in);
int x=in.nextInt();
System.out.println(getAns(x));
}
}