Algorithm 编程:给出所有这些数字的计数,这些数字的十进制表示形式为3

Algorithm 编程:给出所有这些数字的计数,这些数字的十进制表示形式为3,algorithm,math,data-structures,Algorithm,Math,Data Structures,给定一个数字n,编写一个函数,返回从1到n的数字计数,这些数字的十进制表示形式中不包含数字3 解决这个问题的最佳方法是什么 我在naive(即nlogn)中使用的方法很容易通过查看复杂性来猜测该方法:以下算法非常有效地计算从0到n-1的整数数量,小数表示形式中没有3。我已将间隔从1修改为。。n到0。。n-1仅用于稍微简化以下计算 我不是复杂性计算方面的专家,但我认为这个算法的复杂性是Olog n,因为它对n的每一个数字执行固定数量的步骤 第一个观察结果是最多包含d位的整数的数量,即间隔0中的数字

给定一个数字n,编写一个函数,返回从1到n的数字计数,这些数字的十进制表示形式中不包含数字3

解决这个问题的最佳方法是什么


我在naive(即nlogn)中使用的方法很容易通过查看复杂性来猜测该方法:

以下算法非常有效地计算从0到n-1的整数数量,小数表示形式中没有3。我已将间隔从1修改为。。n到0。。n-1仅用于稍微简化以下计算

我不是复杂性计算方面的专家,但我认为这个算法的复杂性是Olog n,因为它对n的每一个数字执行固定数量的步骤


第一个观察结果是最多包含d位的整数的数量,即间隔0中的数字。。10d-1的十进制表示中没有数字3正好是9d,因为对于每个数字,您有9个可能的选择0,1,2,4,5,6,7,8,9

现在让我用一个5位数字n=a4a3a2a1a0来演示这个算法

我们分别计算区间小数表示形式中无3的整数数


I0:a4a3a2a1 0下面的算法非常有效地计算从0到n-1的整数数量,小数表示形式中没有3。我已将间隔从1修改为。。n到0。。n-1仅用于稍微简化以下计算

我不是复杂性计算方面的专家,但我认为这个算法的复杂性是Olog n,因为它对n的每一个数字执行固定数量的步骤


第一个观察结果是最多包含d位的整数的数量,即间隔0中的数字。。10d-1的十进制表示中没有数字3正好是9d,因为对于每个数字,您有9个可能的选择0,1,2,4,5,6,7,8,9

现在让我用一个5位数字n=a4a3a2a1a0来演示这个算法

我们分别计算区间小数表示形式中无3的整数数


I0:a4a3a2a1 0@Marcin thot观察模式3是如何在每个位置发生的,如在单位位置、十个位置等,在单位位置3在每10次迭代后发生,同样在十个位置。。。一般来说,解决这类问题的最好方法不是问问题,而是阅读数学相关分支的文献。这是组合数学。你的n log n算法是什么?@templatetypedef有点蛮力,从1到n迭代检查所有数字,因为没有数字的顺序是logn,所以它的名称是数字,以十进制表示为3。第一句说不包含数字3。你想要哪一个?@Marcin thot看到了3是如何在每个位置出现的模式,如在单位位置、十个位置等,在单位位置3在每10次迭代后出现,同样在十个位置。。。一般来说,解决这类问题的最好方法不是问问题,而是阅读数学相关分支的文献。这是组合数学。你的n log n算法是什么?@templatetypedef有点蛮力,从1到n迭代检查所有数字,因为没有数字的顺序是logn,所以它的名称是数字,以十进制表示为3。第一句说不包含数字3。您想要哪一个?第一个观察结果是最多包含d位的整数的数量,即间隔0中的数字。。10^d-1正好是9^d,因为对于每个数字,你有9个可能的选择0,1,2,4,5,6,7,8,9。-目前来看,这是错误的。0-9是10位数,此类整数的数量是10^d,而不是9^d。我还没来得及看其他的,但这部分是错的。@IVlad:整个问题是关于数字的十进制表示形式中没有数字3,这就是我在这里的意思。我会立即在回答中解决这个问题。谢谢你的反馈。是的,现在看起来好多了。没有看到那里没有3,这有点让人困惑。第一个观察结果是最多有d位的整数的数量,即间隔为0的数字。。10^d-1正好是9^d,因为对于每个数字,你有9个可能的选择0,1,2,4,5,6,7,8,9。-目前来看,这是错误的。0-9是10位数,此类整数的数量是10^d,而不是9^d。我还没来得及看其他的,但这部分是错的。@IVlad:整个问题是关于数字的十进制表示形式中没有数字3,这就是我在这里的意思。我会立即在回答中解决这个问题。谢谢你的反馈。是的,现在看起来好多了。没有看到那里没有3号,这有点让人困惑。
/*
 * Compute number of integers x with 0 <= x < n that do not
 * have a 3 in their decimal representation.
 */
int f(int n)
{
    int count = 0;
    int a;      // The current digit a_j
    int p = 1;  // The current value of 9^j

    while (n > 0) {
        a = n % 10;
        if (a == 3) {
            count = 0;
        }
        if (a <= 3) {
            count += a * p;
        } else {
            count += (a-1) * p;
        }
        n /= 10;
        p *= 9;
    }

    return count;
}