Count total number of N digit numbers such that the difference between sum of even and odd digits is 1

Given a number n, we need to count the total number of n digit numbers such that the sum of even digits is 1 more than the sum of odd digits. Here even and odd means positions of digits are like array indexes, for example, the leftmost (or leading) digit is considered as even digit, next to leftmost is considered as odd, and so on.
Example:Â
Input: n = 2 Output: Required Count of 2 digit numbers is 9 Explanation : 10, 21, 32, 43, 54, 65, 76, 87, 98. Input: n = 3 Output: Required Count of 3 digit numbers is 54 Explanation: 100, 111, 122, ......, 980
We strongly recommend you to minimize your browser and try this yourself first.
This problem is mainly an extension of Count of n digit numbers whose sum of digits equals to given sum. Here the solution of subproblems depends on four variables: digits, esum (current even sum), osum (current odd sum), isEven(A flag to indicate whether the current digit is even or odd).
Below is Memoization based solution for the same.Â
C++
// A memoization based recursive program to count numbers// with difference between odd and even digit sums as 1#include<bits/stdc++.h>  using namespace std;  // A lookup table used for memoization.unsigned long long int lookup[50][1000][1000][2];  // Memoization based recursive function to count numbers// with even and odd digit sum difference as 1. This function// considers leading zero as a digitunsigned long long int countRec(int digits, int esum,                               int osum, bool isOdd, int n){    // Base Case    if (digits == n)        return (esum - osum == 1);      // If current subproblem is already computed    if (lookup[digits][esum][osum][isOdd] != -1)        return lookup[digits][esum][osum][isOdd];      // Initialize result    unsigned long long int ans = 0;      // If the current digit is odd, then add it to odd sum and recur    if (isOdd)      for (int i = 0; i <= 9; i++)          ans += countRec(digits+1, esum, osum+i, false, n);    else // Add to even sum and recur      for (int i = 0; i <= 9; i++)          ans += countRec(digits+1, esum+i, osum, true, n);      // Store current result in lookup table and return the same    return lookup[digits][esum][osum][isOdd] = ans;}  // This is mainly a wrapper over countRec. It// explicitly handles leading digit and calls// countRec() for remaining digits.unsigned long long int finalCount(int n){    // Initialize number digits considered so far    int digits = 0;      // Initialize all entries of lookup table    memset(lookup, -1, sizeof lookup);      // Initialize final answer    unsigned long long int ans = 0;      // Initialize even and odd sums    int esum = 0, osum = 0;      // Explicitly handle first digit and call recursive function    // countRec for remaining digits. Note that the first digit    // is considered as even digit.    for (int i = 1; i <= 9; i++)          ans += countRec(digits+1, esum + i, osum, true, n);      return ans;}  // Driver programint main(){    int n = 3;    cout << "Count of "<<n << " digit numbers is " << finalCount(n);    return 0;} |
Java
// A memoization based recursive // program to count numbers with // difference between odd and // even digit sums as 1class GFG {Â Â Â Â Â // A lookup table used for memoization.static int [][][][]lookup = new int[50][1000][1000][2];Â
// Memoization based recursive // function to count numbers// with even and odd digit sum // difference as 1. This function// considers leading zero as a digitstatic int countRec(int digits, int esum,                            int osum, int isOdd, int n){    // Base Case    if (digits == n)        return (esum - osum == 1)?1:0;Â
    // If current subproblem is already computed    if (lookup[digits][esum][osum][isOdd] != -1)        return lookup[digits][esum][osum][isOdd];Â
    // Initialize result    int ans = 0;Â
    // If current digit is odd, then    // add it to odd sum and recur    if (isOdd==1)    for (int i = 0; i <= 9; i++)        ans += countRec(digits+1, esum, osum+i, 0, n);    else // Add to even sum and recur    for (int i = 0; i <= 9; i++)        ans += countRec(digits+1, esum+i, osum, 1, n);Â
    // Store current result in lookup     // table and return the same    return lookup[digits][esum][osum][isOdd] = ans;}Â
// This is mainly a wrapper over countRec. It// explicitly handles leading digit and calls// countRec() for remaining digits.static int finalCount(int n){    // Initialize number digits considered so far    int digits = 0;Â
    // Initialize all entries of lookup table    for(int i = 0; i < 50; i++)        for(int j = 0; j < 1000; j++)            for(int k = 0; k < 1000; k++)                for(int l = 0; l < 2; l++)                    lookup[i][j][k][l] = -1;Â
Â
    // Initialize final answer    int ans = 0;Â
    // Initialize even and odd sums    int esum = 0, osum = 0;Â
    // Explicitly handle first digit and     // call recursive function countRec     // for remaining digits. Note that    // the first digit is considered     // as even digit.    for (int i = 1; i <= 9; i++)        ans += countRec(digits+1, esum + i, osum, 1, n);Â
    return ans;}Â
// Driver programpublic static void main(String[] args) {Â Â Â Â int n = 3;Â Â Â Â System.out.println("Count of "+ n + Â Â Â Â Â Â Â Â Â Â Â Â " digit numbers is " + finalCount(n));}}Â
// This code has been contributed by 29AjayKumar |
Python3
# A memoization based recursive program to count numbers# with difference between odd and even digit sums as 1Â
# Memoization based recursive function to count numbers# with even and odd digit sum difference as 1. This function# considers leading zero as a digitdef countRec(digits, esum, osum, isOdd, n):Â
    # Base Case    if digits == n:        return (esum - osum == 1)Â
    # If current subproblem is already computed    if lookup[digits][esum][osum][isOdd] != -1:        return lookup[digits][esum][osum][isOdd]Â
    # Initialize result    ans = 0Â
    # If the current digit is odd,     # then add it to odd sum and recur    if isOdd:        for i in range(10):            ans += countRec(digits + 1, esum,                             osum + i, False, n)Â
    # Add to even sum and recur    else:        for i in range(10):            ans += countRec(digits + 1, esum + i,                             osum, True, n)Â
    # Store current result in lookup table     # and return the same    lookup[digits][esum][osum][isOdd] = ans    return ansÂ
# This is mainly a wrapper over countRec. It# explicitly handles leading digit and calls# countRec() for remaining digits.def finalCount(n):Â Â Â Â global lookupÂ
    # Initialize number digits considered so far    digits = 0Â
    # Initialize all entries of lookup table    lookup = [[[[-1, -1] for i in range(500)]                         for j in range(500)]                          for k in range(50)]Â
    # Initialize final answer    ans = 0Â
    # Initialize even and odd sums    esum = 0    osum = 0Â
    # Explicitly handle first digit and call     # recursive function countRec for remaining digits.     # Note that the first digit is considered as even digit    for i in range(1, 10):        ans += countRec(digits + 1, esum + i,                         osum, True, n)Â
    return ansÂ
# Driver Codeif __name__ == "__main__":         # A lookup table used for memoization.    lookup = []    n = 3    print("Count of %d digit numbers is %d" % (n, finalCount(n)))Â
# This code is contributed by# sanjeev2552 |
C#
// A memoization based recursive // program to count numbers with // difference between odd and // even digit sums as 1 using System;Â Â Â Â Â class GFG {Â Â Â Â Â // A lookup table used for memoization.static int [,,,]lookup = new int[50,1000,1000,2];Â
// Memoization based recursive // function to count numbers// with even and odd digit sum // difference as 1. This function// considers leading zero as a digitstatic int countRec(int digits, int esum,                    int osum, int isOdd, int n){    // Base Case    if (digits == n)        return (esum - osum == 1)?1:0;Â
    // If current subproblem is already computed    if (lookup[digits,esum,osum,isOdd] != -1)        return lookup[digits,esum,osum,isOdd];Â
    // Initialize result    int ans = 0;Â
    // If current digit is odd, then    // add it to odd sum and recur    if (isOdd==1)    for (int i = 0; i <= 9; i++)        ans += countRec(digits+1, esum, osum+i, 0, n);    else // Add to even sum and recur    for (int i = 0; i <= 9; i++)        ans += countRec(digits+1, esum+i, osum, 1, n);Â
    // Store current result in lookup     // table and return the same    return lookup[digits,esum,osum,isOdd] = ans;}Â
// This is mainly a wrapper over countRec. It// explicitly handles leading digit and calls// countRec() for remaining digits.static int finalCount(int n){    // Initialize number digits considered so far    int digits = 0;Â
    // Initialize all entries of lookup table    for(int i = 0; i < 50; i++)        for(int j = 0; j < 1000; j++)            for(int k = 0; k < 1000; k++)                for(int l = 0; l < 2; l++)                    lookup[i,j,k,l] = -1;Â
Â
    // Initialize final answer    int ans = 0;Â
    // Initialize even and odd sums    int esum = 0, osum = 0;Â
    // Explicitly handle first digit and     // call recursive function countRec     // for remaining digits. Note that    // the first digit is considered     // as even digit.    for (int i = 1; i <= 9; i++)        ans += countRec(digits+1, esum + i, osum, 1, n);Â
    return ans;}Â
// Driver codepublic static void Main(String[] args) {Â Â Â Â int n = 3;Â Â Â Â Console.WriteLine("Count of "+ n + Â Â Â Â Â Â Â Â Â Â Â Â " digit numbers is " + finalCount(n));}}Â
// This code is contributed by Rajput-Ji |
Javascript
<script>Â
// A memoization based recursive // program to count numbers with // difference between odd and // even digit sums as 1Â
// A lookup table used for memoization.let lookup = new Array(50);for(let i=0;i<50;i++){Â Â Â Â lookup[i]=new Array(1000);Â Â Â Â for(let j=0;j<1000;j++)Â Â Â Â {Â Â Â Â Â Â Â Â lookup[i][j]=new Array(1000);Â Â Â Â Â Â Â Â for(let k=0;k<1000;k++)Â Â Â Â Â Â Â Â {Â Â Â Â Â Â Â Â Â Â Â Â lookup[i][j][k]=new Array(2);Â Â Â Â Â Â Â Â }Â Â Â Â Â Â Â Â Â Â Â Â Â }}Â
// Memoization based recursive // function to count numbers// with even and odd digit sum // difference as 1. This function// considers leading zero as a digitfunction countRec(digits,esum,osum,isOdd,n){    // Base Case    if (digits == n)        return (esum - osum == 1)?1:0;       // If current subproblem is already computed    if (lookup[digits][esum][osum][isOdd] != -1)        return lookup[digits][esum][osum][isOdd];       // Initialize result    let ans = 0;       // If current digit is odd, then    // add it to odd sum and recur    if (isOdd==1)    for (let i = 0; i <= 9; i++)        ans += countRec(digits+1, esum, osum+i, 0, n);    else // Add to even sum and recur    for (let i = 0; i <= 9; i++)        ans += countRec(digits+1, esum+i, osum, 1, n);       // Store current result in lookup     // table and return the same    return lookup[digits][esum][osum][isOdd] = ans;}Â
// This is mainly a wrapper over countRec. It// explicitly handles leading digit and calls// countRec() for remaining digits.function finalCount(n){    // Initialize number digits considered so far    let digits = 0;       // Initialize all entries of lookup table    for(let i = 0; i < 50; i++)        for(let j = 0; j < 1000; j++)            for(let k = 0; k < 1000; k++)                for(let l = 0; l < 2; l++)                    lookup[i][j][k][l] = -1;          // Initialize final answer    let ans = 0;       // Initialize even and odd sums    let esum = 0, osum = 0;       // Explicitly handle first digit and     // call recursive function countRec     // for remaining digits. Note that    // the first digit is considered     // as even digit.    for (let i = 1; i <= 9; i++)        ans += countRec(digits+1, esum + i, osum, 1, n);       return ans;}Â
// Driver programlet n = 3;document.write("Count of "+ n + Â Â Â Â Â Â Â Â Â Â Â Â " digit numbers is " + finalCount(n));Â
Â
// This code is contributed by rag2127Â
</script> |
Output:Â
Count of 3 digit numbers is 54
Thanks to Gaurav Ahirwar for providing above solution.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Â
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!



