用递归方法计算数字的奇数位数

时间:2017-02-03 13:23:38

标签: java

我试着编写一个简单的java程序来计算一个数字中有多少个奇数(例如,对于输入" 123"程序应该返回2)。程序改为返回给定数字的所有数字。有什么想法吗?

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;
    }
}

5 个答案:

答案 0 :(得分:5)

这是一种在没有所有不必要条件的情况下编写递归方法的方法。

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

使用&1代替%2可以使其适用于负数和正数。

答案 1 :(得分:1)

检查你的代码,你在这个if条件中使用/而不是%:

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

应该是:

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

答案 2 :(得分:0)

在oddDigitCounter()中,为什么不简单地逐位检查它是偶数还是奇数并回显(存储)结果?

递归方法:在第一次调用时你可以将整个数字传递给函数,然后如果数字长度为1位,让函数进行检查并返回,其他的则检查第1位数字并再次传递给其他数字功能本身。

程序方法:在数字上做一个简单的循环并进行检查。

答案 3 :(得分:0)

您可以使用以下示例:

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);
        }
    }

}

答案 4 :(得分:-1)

您可以使用Stream对迭代和过滤非常有用,例如:

public static int oddDigitCounter(int number) {
        long result = 0;
        String numb = ""+number;
        result = numb.chars().filter(val -> val%2==1).count();
        return Math.toIntExact(result);
}

在这里你创建一个String号码,它允许迭代它,然后你filter只保留奇数号码,然后你count你得到多少。由于Steam的result方法原因,long必须属于count()类型

如果删除所有变量,可以在一行 中删除

public static int oddDigitCounter(int number) {
        return Math.toIntExact(String.valueOf(number).chars().filter(val -> val%2==1).count());
    }

如果您对此感觉不满意,可以采用更通用的方式:

public static int oddDigitCounter(int number) {
        int result = 0;
        String numb = ""+number;
        for(int i=0;i<numb.length();i++){
            if(numb.charAt(i)%2==1){
                result++;
            }
        }
        return result;
    }

我希望一切都有用