You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

1到指定数字区间内各数位出现次数计算需求及前置实现

Efficient Digit Counting from 1 to N Using Your Existing Splitting Function

Got it, let's tackle this problem step by step. Since you already have a function that splits a number into its digit-place components (like breaking 2512 into 2000, 500, 10, 2), we can leverage that to count digit occurrences without iterating every single number—which is crucial for handling large values of N efficiently.

Core Idea

Instead of checking each number in the sequence, we'll count how many times each digit (0-9) appears in each positional place (units, tens, hundreds, etc.), then sum up the counts across all positions. This reduces the problem from O(N) time complexity to O(number of digits in N), which is way faster.

Step-by-Step Implementation

Let's assume your splitting function is called split_into_digit_places(n) and returns a list of digit-place values (e.g., [2000, 500, 10, 2] for n=2512). Here's how to build the counting logic:

1. Initialize a Count Array

First, create an array of 10 zeros to track occurrences of digits 0 through 9:

counts = [0] * 10

2. Process Each Digit Place

For each place value (like 2000 or 10) returned by your splitting function:

  • Extract the current digit (e.g., 2 for 2000, 1 for 10) and the place weight (e.g., 1000 for 2000, 10 for 10).
  • Calculate the higher digits (the part of N to the left of the current place) and lower digits (the part to the right).
  • Use these values to count occurrences for digits 1-9, then handle 0 separately (since 0 can't lead a number).

3. Code Example

Here's a complete Python implementation that uses your splitting function (I included a sample version of the split function in case you need it):

def split_into_digit_places(n):
    # Sample implementation of your digit-place splitting function
    places = []
    weight = 1
    while n > 0:
        digit = n % 10
        if digit != 0:
            places.append(digit * weight)
        n = n // 10
        weight *= 10
    return places[::-1]  # Return from highest to lowest place

def count_digit_occurrences(n):
    counts = [0] * 10
    if n == 0:
        return counts
    
    places = split_into_digit_places(n)
    for place in places:
        # Get current digit and place weight
        weight = 1
        temp = place
        while temp >= 10:
            temp = temp // 10
            weight *= 10
        current_digit = place // weight
        
        higher = n // (weight * 10)
        lower = n % weight
        
        # Count digits 1-9
        for d in range(1, 10):
            if current_digit > d:
                counts[d] += (higher + 1) * weight
            elif current_digit == d:
                counts[d] += higher * weight + lower + 1
            else:
                counts[d] += higher * weight
        
        # Count digit 0 (avoid leading zeros)
        if higher != 0:
            if current_digit > 0:
                counts[0] += higher * weight
            elif current_digit == 0:
                counts[0] += (higher - 1) * weight + lower + 1
    
    # Format output as requested: 1's count, 2's count, ..., 0's count
    return [counts[i] for i in range(1, 10)] + [counts[0]]

# Test with your example
n = 12
result = count_digit_occurrences(n)
print(' '.join(map(str, result)))  # Output: 5 2 1 1 1 1 1 1 1 1

How It Works for the Sample Input (n=12)

Let's walk through the sample to verify:

  • Units place (weight=1, current_digit=2):
    • Digits 1: Appears in 1,11 → 2 times
    • Digit 2: Appears in 2,12 → 2 times
    • Digits 3-9: Each appears once (3-9)
    • Digit 0: Appears once (10)
  • Tens place (weight=10, current_digit=1):
    • Digit 1: Appears in 10-12 → 3 times
    • Digits 2-9: No occurrences
    • Digit 0: Skipped (since higher digits are 0, no leading zeros)

Summing these gives the output 5 2 1 1 1 1 1 1 1 1, which matches your example.

内容的提问来源于stack exchange,提问作者Kamran Poladov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:06:23