Count of different numbers divisible by 3 that can be obtained by changing at most one digit

02 Mar, 2022
Given a string str representing a number having N digits, the task is to calculate the number of ways to make the given number divisible by 3 by changing at most one digit of the number.
Examples:
Input: str[] = “23”Output: 7Explanation: Below are the numbers that can be made from the string which are divisible by 3 – 03, 21, 24, 27, 33, 63, 931.Change 2 to 0 (0+3)=3 divisible by 32.Change 3 to 1 (2+1)=3 divisible by 33 change 3 to 4 (2+4)=6 divisible by 34 change 2 to 3 sum is 6 divisible by 3Similarly there are total 7 number of ways to make the given number divisible by 3
Input: str[] = “235”Output: 9
Approach: The idea is very simple to solve this problem. Calculate the sum of digits of a given number and then for each index, remove that digit and try all possible digits from 0 to 9 and see if the sum is divisible by 3 or not. Follow the steps below to solve the problem:
Initialize the variable sum as 0 to store the sum of digits of the number.
Iterate over a range [0, N] using the variable i and perform the following steps:Add the value of digit at i-th index in the variable sum.
Add the value of digit at i-th index in the variable sum.
Initialize the variable count as 0 to store the answer.
If the number itself is divisible by 3 then increment count by one.
Iterate over a range [0, N] using the variable i and perform the following steps:Initialize the variable remaining_sum as sum-(number.charAt(i)-48).Iterate over a range [0, 9] using the variable j and perform the following steps:Add the value of j to the variable remaining_sum and if remaining_sum is divisible by 3 and j is not equal to the digit at i-th index, then add the value of count by 1.
Initialize the variable remaining_sum as sum-(number.charAt(i)-48).
Iterate over a range [0, 9] using the variable j and perform the following steps:Add the value of j to the variable remaining_sum and if remaining_sum is divisible by 3 and j is not equal to the digit at i-th index, then add the value of count by 1.
Add the value of j to the variable remaining_sum and if remaining_sum is divisible by 3 and j is not equal to the digit at i-th index, then add the value of count by 1.
After performing the above steps, print the value of count as the answer.
Below is the implementation of the above approach..
C++
Java
Python3
C#
Javascript
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;  // Function to count the number of// possible numbers divisible by 3void findCount(string number){      // Calculate the sum    int sum = 0;    for (int i = 0; i < number.length(); ++i) {        sum += number[i] - 48;    }      // Store the answer    int count = 0;      // Consider the edge case when    // the number itself is divisible by 3    // The count will be added by 1    if (sum % 3 == 0)        count++;      // Iterate over the range    for (int i = 0; i < number.length(); ++i) {          // Decreasing the sum        int remaining_sum = sum - (number[i] - 48);          // Iterate over the range        for (int j = 0; j <= 9; ++j) {              // Checking if the new sum            // is divisible by 3 or not            if ((remaining_sum + j) % 3 == 0                && j != number[i] - 48) {                  // If yes increment                // the value of the count                ++count;            }        }    }    cout << count;}  // Driver Codeint main(){    // Given number    string number = "235";      findCount(number);    return 0;}
// Java program for the above approachimport java.io.*;import java.util.*;  class GFG {      // Function to count the number of    // possible numbers divisible by 3    public static void findCount(String number)    {          // Calculate the sum        int sum = 0;        for (int i = 0; i < number.length(); ++i) {            sum += number.charAt(i) - 48;        }          // Store the answer        int count = 0;        if (sum % 3 == 0)            count++;          // Iterate over the range        for (int i = 0; i < number.length(); ++i) {              // Decreasing the sum            int remaining_sum                = sum - (number.charAt(i) - 48);              // Iterate over the range            for (int j = 0; j <= 9; ++j) {                  // Checking if the new sum                // is divisible by 3 or not                if ((remaining_sum + j) % 3 == 0                    && j != number.charAt(i) - 48) {                      // If yes increment                    // the value of the count                    ++count;                }            }        }        System.out.println(count);    }      // Driver Code    public static void main(String[] args)    {        // Given number        String number = "235";          findCount(number);    }}
# Python program for the above approach  # Function to count the number of# possible numbers divisible by 3    def findCount(number):      # Calculate the sum    sum = 0    for i in range(len(number)):        sum += int(number[i]) - 48      # Store the answer    count = 0    if(sum % 3 == 0):      count += 1      # Iterate over the range    for i in range(len(number)):          # Decreasing the sum        remaining_sum = sum - (int(number[i]) - 48)          # Iterate over the range        for j in range(10):              # Checking if the new sum            # is divisible by 3 or not            if ((remaining_sum + j) % 3 == 0 and j != int(number[i]) - 48):                  # If yes increment                # the value of the count                count += 1      print(count)  # Driver Code    # Given numbernumber = "235"findCount(number)
// C# program for the above approachusing System;using System.Collections.Generic;  class GFG {      // Function to count the number of    // possible numbers divisible by 3    static void findCount(string number)    {          // Calculate the sum        int sum = 0;        for (int i = 0; i < number.Length; ++i) {            sum += (int)number[i] - 48;        }          // Store the answer        int count = 0;        if (sum % 3 == 0)            count++;          // Iterate over the range        for (int i = 0; i < number.Length; ++i) {              // Decreasing the sum            int remaining_sum = sum - ((int)number[i] - 48);              // Iterate over the range            for (int j = 0; j <= 9; ++j) {                  // Checking if the new sum                // is divisible by 3 or not                if ((remaining_sum + j) % 3 == 0                    && j != number[i] - 48) {                      // If yes increment                    // the value of the count                    ++count;                }            }        }        Console.Write(count);    }      // Driver Code    public static void Main()    {          // Given number        string number = "235";          findCount(number);    }}
<script>// Javascript program for the above approach  // Function to count the number of// possible numbers divisible by 3function findCount(number) {  // Calculate the sum  let sum = 0;  for (let i = 0; i < number.length; ++i) {    sum += number[i] - 48;  }    // Store the answer  let count = 0;  if(sum % 3 == 0) count++;  // Iterate over the range  for (let i = 0; i < number.length; ++i) {    // Decreasing the sum    let remaining_sum = sum - (number[i] - 48);      // Iterate over the range    for (let j = 0; j <= 9; ++j) {      // Checking if the new sum      // is divisible by 3 or not      if ((remaining_sum + j) % 3 == 0 && j != number[i] - 48) {        // If yes increment        // the value of the count        ++count;      }    }  }  document.write(count);}  // Driver Code  // Given numberlet number = "235";  findCount(number);  // This code is contributed by gfgking  </script>
9
Time Complexity: O(N)Auxiliary Space: O(1)
ipg2016107
gfgking
SURENDRA_GANGWAR
anikaseth98
germanshephered48
nehakumariintern
divisibility
number-digits
Mathematical
Searching
Searching
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.