数据量很大,如果是直接枚举1 N跳过了那些数字,肯定是超时的,其实相比于正常计数的10进制,这里变成了9进制,”满9进一,因为4被跳过了,因此我们可以直接枚举每一位的贡献,比如123=1∗102+2∗10+3,现在就需要变成1∗92+2∗9+3,当然,还有一些细节需要处理,比如如果某一位超过了4,那需要-1之后再去计算,因为跳过了所有的含有4的数。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function () {
    // Write your code here
    let N = parseInt(await readline());
    let strN = String(N);
    let len = strN.length;
    let sum = 0;
    for (let i = 0; i < len; i++) {
        let num = parseInt(strN[i]);
        if (num > 4) {
            num--;
        }
        sum += num ?  num * Math.pow(9, len - i -1) : 0;
    }
    console.log(sum);
}()
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int power = 0;
        int ret = 0;
        while (n > 0) {
            int x = n % 10;
            if ( x > 4) x--;
            ret += x * (int)Math.pow(9, power);
            n /= 10;
            power++;
        }
        System.out.println(ret);
    }
}
n = int(input())
ans = 0
l = []
while n > 0:
    t = n % 10
    l.append(t)
    n //= 10
while l:
    t = l.pop()
    ans = ans * 9 + t
    if t > 4:
        ans -= 1
print(ans)
#include <iostream>
#include <string>
using namespace std;
int main() {
#include <iostream>
#include <string>
using namespace std;
int main() {
    string w;
    cin >> w;
    int n = w.length();
    long long ans = 0;
    for (int i = 0; i < n; i++) {
        int cost = w[i] - '0';
        if (w[i] > '4') {
            cost -= 1;
        }
        for (int j = n - i - 1; j > 0; j--) {
            cost *= 9;
        }
        ans += cost;
    }
    cout << ans << endl;
    return 0;
}
        程序员只小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。比如:
小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。 给出计费表的表面读数,返回实际产生的费用。
只有一行,数字N,表示里程表的读数。(1≤N≤88888888)。
一个数字,表示实际产生的费用。以回车结束。
输入
5
输出
4
说明
5表示计费表的表面读数
4表示实际产生的费用其实只有4块钱
输入
17
输出
15
说明
17表示计费表的表面读数。
15表示实际产生的费用其实只有15块钱
输入
100
输出
81