0

我正在编写一个使用一系列数字进行输入的程序。使用递归和数组我试图添加所有输入的可被 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);           
    }      
}
}
4

2 回答 2

1

好的,这里有几件事:

1) 一个数 n 可以被三整除,如果:n%3 == 0不是n%3 == 1

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

把这两件事整理出来,它应该可以工作。这似乎是家庭作业,所以我很谨慎地只给你正确的代码,而不是让你完成它并理解它。

一旦你得到它的工作,我有两个建议:

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

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

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

于 2013-11-08T16:04:33.093 回答
0

... 字符串线 = 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;
}
于 2013-11-08T16:23:19.417 回答