📜  计算不包含3的数字

📅  最后修改于: 2021-05-07 08:44:23             🧑  作者: Mango

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

Input: n = 10
Output: 9 

Input: n = 45
Output: 31 
// Numbers 3, 13, 23, 30, 31, 32, 33, 34, 
// 35, 36, 37, 38, 39, 43 contain digit 3. 

Input: n = 578
Output: 385

我们强烈建议您单击此处并进行实践,然后再继续解决方案。

解决方案:
我们可以递归地解决它。令count(n)为计算此类数字的函数。

'msd' --> the most significant digit in n 
'd'   --> number of digits in n.

count(n) = n if n < 3

count(n) = n - 1 if 3 <= n  10 and msd is not 3

count(n) = count( msd * (10^(d-1)) - 1) 
           if n > 10 and msd is 3
Let us understand the solution with n = 578. 
count(578) = 4*count(99) + 4 + count(78)
The middle term 4 is added to include numbers 
100, 200, 400 and 500.

Let us take n = 35 as another example.  
count(35) = count (3*10 - 1) = count(29)
C++
#include 
using namespace std;
 
/* returns count of numbers which are
in range from 1 to n and don't contain 3
as a digit */
int count(int n)
{
    // Base cases (Assuming n is not negative)
    if (n < 3)
        return n;
    if (n >= 3 && n < 10)
        return n-1;
 
    // Calculate 10^(d-1) (10 raise to the power d-1) where d is
    // number of digits in n. po will be 100 for n = 578
    int po = 1;
    while (n/po > 9)
        po = po*10;
 
    // find the most significant digit (msd is 5 for 578)
    int msd = n/po;
 
    if (msd != 3)
        // For 578, total will be 4*count(10^2 - 1) + 4 + count(78)
        return count(msd)*count(po - 1) + count(msd) + count(n%po);
    else
        // For 35, total will be equal to count(29)
        return count(msd*po - 1);
}
 
// Driver code
int main()
{
    cout << count(578) << " ";
    return 0;
}
 
// This code is contributed by rathbhupendra


C
#include 
 
/* returns count of numbers which are in range from 1 to n and don't contain 3
   as a digit */
int count(int n)
{
    // Base cases (Assuming n is not negative)
    if (n < 3)
        return n;
    if (n >= 3 && n < 10)
       return n-1;
 
    // Calculate 10^(d-1) (10 raise to the power d-1) where d is
    // number of digits in n. po will be 100 for n = 578
    int po = 1;
    while (n/po > 9)
        po = po*10;
 
    // find the most significant digit (msd is 5 for 578)
    int msd = n/po;
 
    if (msd != 3)
      // For 578, total will be 4*count(10^2 - 1) + 4 + count(78)
      return count(msd)*count(po - 1) + count(msd) + count(n%po);
    else
      // For 35, total will be equal to count(29)
      return count(msd*po - 1);
}
 
// Driver program to test above function
int main()
{
    printf ("%d ", count(578));
    return 0;
}


Java
// Java program to count numbers that not contain 3
import java.io.*;
 
class GFG
{
    // Function that returns count of numbers which
    // are in range from 1 to n
    // and not contain 3 as a digit
    static int count(int n)
    {
        // Base cases (Assuming n is not negative)
        if (n < 3)
            return n;
        if (n >= 3 && n < 10)
            return n-1;
  
        // Calculate 10^(d-1) (10 raise to the power d-1) where d is
        // number of digits in n. po will be 100 for n = 578
        int po = 1;
        while (n/po > 9)
            po = po*10;
  
        // find the most significant digit (msd is 5 for 578)
        int msd = n/po;
  
        if (msd != 3)
            // For 578, total will be 4*count(10^2 - 1) + 4 + count(78)
            return count(msd)*count(po - 1) + count(msd) + count(n%po);
        else
            // For 35, total will be equal to count(29)
            return count(msd*po - 1);
    }
     
    // Driver program
    public static void main (String[] args)
    {
        int n = 578;
        System.out.println(count(n));
    }
}
 
// Contributed by Pramod Kumar


Python
# Python program to count numbers upto n that don't contain 3
 
# Returns count of numbers which are in range from 1 to n
# and don't contain 3 as a digit
def count(n):
     
    # Base Cases ( n is not negative)
    if n < 3:
        return n
    elif n >= 3 and n < 10:
        return n-1
         
    # Calculate 10^(d-1) ( 10 raise to the power d-1 ) where d
    # is number of digits in n. po will be 100 for n = 578
     
    po = 1
    while n/po > 9:
        po = po * 10
     
    # Find the MSD ( msd is 5 for 578 )
    msd = n/po
     
    if msd != 3:
        # For 578, total will be 4*count(10^2 - 1) + 4 + ccount(78)
        return count(msd) * count(po-1) + count(msd) + count(n%po)
    else:
        # For 35 total will be equal to count(29)
        return count(msd * po - 1)
         
# Driver Program
n = 578
print count(n)
 
# Contributed by Harshit Agrawal


C#
// C# program to count numbers that not
// contain 3
using System;
 
class GFG {
     
    // Function that returns count of
    // numbers which are in range from
    // 1 to n and not contain 3 as a
    // digit
    static int count(int n)
    {
         
        // Base cases (Assuming n is
        // not negative)
        if (n < 3)
            return n;
        if (n >= 3 && n < 10)
            return n-1;
 
        // Calculate 10^(d-1) (10 raise
        // to the power d-1) where d is
        // number of digits in n. po will
        // be 100 for n = 578
        int po = 1;
         
        while (n / po > 9)
            po = po * 10;
 
        // find the most significant
        // digit (msd is 5 for 578)
        int msd = n / po;
 
        if (msd != 3)
         
            // For 578, total will be
            // 4*count(10^2 - 1) + 4 +
            // count(78)
            return count(msd) * count(po - 1)
                + count(msd) + count(n % po);
        else
         
            // For 35, total will be equal
            // to count(29)
            return count(msd * po - 1);
    }
     
    // Driver program
    public static void Main ()
    {
        int n = 578;
         
        Console.Write(count(n));
    }
}
 
// This code is contributed by Sam007.


PHP
= 3 && $n < 10)
        return $n-1;
 
    // Calculate 10^(d-1) (10 raise to the
    // power d-1) where d is number of digits
    // in n. po will be 100 for n = 578
    $po = 1;
    for($x = intval($n/$po); $x > 9; $x = intval($n/$po))
        $po = $po*10;
 
    // find the most significant digit (msd is 5 for 578)
    $msd = intval($n / $po);
 
    if ($msd != 3)
     
    // For 578, total will be 4*count(10^2 - 1)
    // + 4 + count(78)
    return count1($msd) * count1($po - 1) +
                count1($msd) + count1($n%$po);
    else
     
    // For 35, total will be equal to count(29)
    return count1($msd*$po - 1);
}
 
// Driver program to test above function
    echo count1(578);
 
// This code is contributed by mits.
?>


Javascript


输出:

385