简体   繁体   中英

Java for loop only executing once

Sorry to ask such a basic question but other questions on here don't seem to fix the problem and I've been staring at it for quite a while now. I'm writing some code to find the smallest common multiple for the numbers from 1 to 20. From debugging, the outer for loop only runs once and I can't figure out why. Can someone please point out where I've gone code blind.

public class ED5 {
public static void main(String[] args){
    int smallestCommonMultiple = 1;
    //excluding 1 because it has no effect on the result and would just mean extra work
    int[] numbers = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    //initially set to true for the first loop
    boolean iIsFactor = true;

    //for each potential divisor from 2-20 (note only the prime divisors will ever cause a division)
    for(int i = 2; i < 21; i++){
        while(iIsFactor){
            //reset flag for the start of each new run through the array
            iIsFactor = false;

            //for each element of the array
            for(int j=0; j<19; j++){
                //if the current divisor is a factor of that array entry
                if(numbers[j]% i == 0){
                    //divide the current entry by the current divisor
                    numbers[j] = numbers[j]/i;
                    //indicate that at least one entry had a factor of i
                    iIsFactor= true;
                }
            }//end for loop for each array pass

            if(iIsFactor){
                smallestCommonMultiple *= i;
            }
        }//end while loop for the divisor
    }//end for loop for all the divisors

    //output result
    System.out.println("The smallest common multiple of the numbers from 1 to 20 is:");
    System.out.println(smallestCommonMultiple);
}

}

The underlying problem has been identified in another answer. This answer is about avoiding the confusion that prevented the OP from seeing which loop was not executing, and therefore failing to find the bug.

When an inner loop is the entire body of an outer loop, it can be unclear which loop is not executing. Printouts and breakpoints that are inside the inner loop are useless for this purpose. The simplest solution is to add a statement at the start of the outer loop. If that statement executes multiple times, it is the inner loop that is not executing. The added statement could be almost anything, but a printout of a key variable for the loop iteration is particularly useful:

for (int i = 2; i < 21; i++) {
  System.out.println("for-loop, i=" + i);
  while (iIsFactor) {

Running the program with that added statement made it obvious that the outer loop was doing the full set of iterations, and the problem had to be with the inner loop.

Your while and boolean declaration is not correct,

for(int i = 2; i < 21; i++){
    //reset flag for the start of each new run through the array
    iIsFactor = false;
    while(!iIsFactor){
while(iIsFactor){
        //reset flag for the start of each new run through the array
        iIsFactor = false;

After this, the next itteration of the loop, that while statement becomes false.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM