数字可被3递归整除

时间:2013-11-08 15:47:13

标签: java arrays recursion

我正在编写一个使用一系列数字输入的程序。使用递归和数组我试图添加所有输入的可被3整除的数字并将它们加在一起。防爆。 3 4 5 6 输出应为9.我的当前输出不断给出3作为我的输入的输出。有任何帮助或建议吗?

import java.io.*;
import java.text.*;
public class Assignment9 {
    public static void main (String args[]) throws IOException{

    int i = 0;
    int [] nums;
    nums = new int [100];
    InputStreamReader inRead = new InputStreamReader(System.in);   
    BufferedReader buffRead = new BufferedReader(inRead);
    String line = buffRead.readLine();
    try {    
        while (line.equals("0") == false && i<100) {        
            i++;        
            line = buffRead.readLine();     
            nums[i]=(int) Double.parseDouble(line);     
        }      
    } catch(IOException e) {        
        System.out.println("Array index out of bound");   
    }   

    int endIndex = computeSumDivisibleBy3(nums, 0, nums.length-1);   

    System.out.print ("The minimum number is " + min + ('\n'));
    System.out.print ("The sum of the numbers divisible by 3 is " + endIndex + ('\n'));
}
}   


public static int computeSumDivisibleBy3(int [] numbers, int startIndex, int endIndex) {
if(startIndex == endIndex) {       
    if(numbers[endIndex] %3 == 0){                
        return (int) numbers[endIndex];            
    } else {                
        return 0;            
    }       
} else {           
    if(numbers[endIndex] %3 == 0) {               
        return (int) (computeSumDivisibleBy3(numbers, startIndex, endIndex - 1) + numbers    
    }
    else {       
        return computeSumDivisibleBy3(numbers, startIndex, endIndex - 1);           
    }      
}
}

2 个答案:

答案 0 :(得分:1)

这里有一些事情:

1)如果出现以下情况,则数字n可被3整除:n%3 == 0而非n%3 == 1

2)当你检查一个数字是否可以被3整除时,你正在检查INDEX是否可以被3整除,而不是数组中的实际数字(使用数字[endIndex])

对这两件事情进行排序,它应该有效。这看起来像是家庭作业,所以我很谨慎地给你正确的代码,而不是让你通过它来理解它。

一旦你开始工作,我有两个建议:

1)你应该为数组使用int []而不是double []。任何不是整数的数字都不会干净地除以3.当您读取文件并添加到数字数组时,请在if语句中使用n%1==0来检查读取的数字是否实际上是整数,应该添加到您的数组中。这将减少递归调用的数量,因为假设您能够处理一些非整数值,数组可能会更短。

2)你可以用两个参数来创建一个递归方法,即int数组和一个索引。可能没有必要,但可以省去担心传递指数的麻烦。提示:startIndex永远不会改变,通过了解数组的长度可以改善你的基本情况。

如果您需要澄清/更多提示,请随时在评论中向我提出更多问题。

答案 1 :(得分:0)

...        String line = buffRead.readLine();

    try {
        while (line.equals("0") == false  && i < 100) {  
            nums[i] = Double.parseDouble(line);         
            i++;

            line = buffRead.readLine();

        }
    } catch (IOException e) {
        System.out.println("Array index out of bound");
    }

    int sum = computeSumDivisibleBy3(nums);

    System.out.print("The sum of the numbers divisible by 3 is " + sum + ('\n'));

.....

public static int computeSumDivisibleBy3(double[] numbers) {
    return _computeSumDivisibleBy3(numbers, 0);
}

    private static int _computeSumDivisibleBy3(double[] numbers, int currentIndex ) {

    int sum = 0;
    if (currentIndex != numbers.length) {
        int currentNumber = (int)numbers[currentIndex];
        sum =  (currentNumber % 3) == 0 ? currentNumber : 0;
        sum += _computeSumDivisibleBy3(numbers, ++currentIndex );
    }

    return sum;
}