catzbro1
catzbro1

Reputation: 45

Count odd digits of a number with recursive method

I tried to write a simple java program which counts how many odd digits there are inside a number (for example, for input "123" the program should return 2). The program instead returns all the digits of the given number. Any idea?

import java.util.*;

//Counts the number of odd digits in an int using recursion
public class OddCount{
    public static void main(String[]args){
        Scanner in = new Scanner(System.in);
        System.out.println("Digit a positive int number: ");
        int n = in.nextInt();
        System.out.println("The number of odd digits is " + oddDigitCounter(n));
    }


    public static int oddDigitCounter(int number) {
        int result = 0;
        if(number<=10){
            if(number%2==0)
                result = 0;
            else
                result++;
        }
        else{
            if(number%10!=0){
                if((number%10)/2!=0)
                    result = 1 + oddDigitCounter(number/10);
                else
                    result = 0 + oddDigitCounter(number/10);
            }
            else{
                result = 0 + oddDigitCounter(number/10);
            }
        }

        return result;
    }
}

Upvotes: 3

Views: 5479

Answers (4)

khelwood
khelwood

Reputation: 59113

Here is a way to write your recursive method without all the unnecessary conditions.

public static int oddDigitCounter(int number) {
    if (number==0) {
        return 0;
    }
    return (number&1) + oddDigitCounter(number/10);
}

Using &1 instead of %2 allows it to work for negative numbers as well as positive ones.1


1 (number&1) is zero for an even number, and one for an odd number, and works regardless of whether the number is positive or negative. For instance, if number==-3 then (number%2)==-1, but (number&1)==1, which is what we want in this case.

Upvotes: 7

GltknBtn
GltknBtn

Reputation: 512

You can use following sample:

import java.util.Scanner;

public class NumberOfOddDigist {

    private static int count = 0;

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        System.out.println("Digit a positive int number: ");
        int n = in.nextInt();
        countOdd(n);
        System.out.println("The number of odd digits is " + count);
        in.close();
    }

    public static void countOdd(int number) {

        int remainder = number % 10;
        int quotient = (number - remainder) / 10;

        if (!(remainder % 2 == 0)) {
            count++;
        }

        number = quotient;
        if (number < 10) {
            if (!(number % 2 == 0)) {
                count++;
            }
        } else {
            countOdd(number);
        }
    }

}

Upvotes: 0

Versatile
Versatile

Reputation: 158

In oddDigitCounter() why don't you simply check digit by digit if it's an even or odd one and echo (store) the result?

Recursive approach: at first call you may pass to the function the entire number and then if the number is 1 digit long let the function do the check and return, otherwhise do the check against the 1st digit and pass the others again to the function itself.

Procedural approach: do a simple loop through the digits and do the checks.

Upvotes: 0

SCouto
SCouto

Reputation: 7928

Check your code, you are using / instead of % in this if condition:

 if((number%10)/2!=0)

It should be:

if((number%10)%2!=0)

Upvotes: 0

Related Questions