题目
题目描述
小明买了一辆二手车,车的里程表以整数形式显示行驶的公里数,但是,里程表存在一个问题:它从数字 2 直接跳到数字 4 ,从数字 7 直接跳到数字 9 ,即总是跳过数字 3 和 8 。这个问题一直存在,例如,如果里程表显示 15229 ,汽车行驶 1 公里,里程表读数将更改为 15240 (而不是 15230 )。
输入格式 输入包含一个整数 n ,表示汽车里程表的当前读数。
输出格式 针对输入,打印出汽车实际行驶的公里数。
输入输出样例1
输入
15 输出
12
输入输出样例2
输入
2005 输出
1028
说明提示
1≤n≤107
解题思路?
这个问题是跳过了 3 和 8,十进制缺两个就是 8 进制,他把原来的数字,按照缺少 3 和 8 的规则换算成 8 进制的缺少 8 和 9,这样转换之后就是一个 8 进制的数字,然后再转就可以变成 10 进制来计算。
代码?
C++
#include <iostream>
#include <cmath>
int main()
{
//计数器
int sum = 0;
//输入汽车里程表的当前读数
int num;
std::cin >> num;
//j表示当前8的次方
for (int j = 0; num != 0; j++) {
//里程表上的个位数
int a = num % 10;
//因为跳过了数字3,4~7的数多加了1,所以要减去1
if (a > 3 && a < 8)
a--;
else if (a == 9) //因为跳过了数字3和8,数字9的数多加了2,所以要减去2
a -= 2;
//把得到的数转化为八进制对应的数
sum += a * pow(8, j);
//每循环一次,减少一位
num /= 10;
}
std::cout << sum;
}
JAVA
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//计数器
int sum = 0;
//输入汽车里程表的当前读数
int num = new Scanner(System.in).nextInt();
//j表示当前8的次方
for (int j = 0; num != 0; j++) {
//里程表上的个位数
int a = num % 10;
//因为跳过了数字3,4~7的数多加了1,所以要减去1
if (a > 3 && a < 8)
a--;
else if (a == 9) //因为跳过了数字3和8,数字9的数多加了2,所以要减去2
a -= 2;
//把得到的数转化为八进制对应的数
sum += a * Math.pow(8, j);
//每循环一次,减少一位
num /= 10;
}
System.out.println(sum);
}
}
Python
import math
# 计数器
sum = 0
# 用户保存输入的里程数
num = int(input("汽车里程数:"))
# 当前的位数,个位为0,十位为1,百位为2
j = 0
while (True):
# 获取个位上的数
a = num % 10
# 因为跳过了数字3,4~7的数多加了1,所以要减去1
if a > 3 and a < 8:
a -= 1
# /因为跳过了数字3和8,数字9的数多加了2,所以要减去2
elif a == 9:
a -= 2
# 把得到的数转化为八进制对应的数
sum += a * pow(8, j)
# 位数每次循环的自增1
j += 1
# 每循环一次,减少一位
num = int(num / 10)
# 仪表盘上得数字为0时,天厨循环
if num == 0:
break
# 打印输出结果
print(sum)
|