Search code examples
javaloopsinfinite

Beginner Java program (calculating deficient, abundant, prime, and perfect numbers)


do
    {
        System.out.println("Enter either limit, abundant, deficient, perfect, or prime = value:");
        condition = scan.next();
        String equals = scan.next();
        num = scan.next();
        value=Integer.parseInt(num);
        if (Type.isInteger(condition) || !Type.isInteger(num) || value<0)
            System.out.println("Please enter in condition = value format");
        else
            break;
    }while(stop);

    System.out.println("N" + "\t" + "Abundant" + " " + "Deficient" + " " + "Perfect" + " " + "Prime");
    sigma = 0; //sets sigma=0
    n=1;

    while (stop)
    {    

        for (f = 1; f <= n/2; f++)
        {
            if (n % f == 0)
                sigma = sigma + f;
        }

        System.out.print(n + "\t");

        if (sigma>n)
            acount++;
        if (sigma == 1) 
            p++; //prime counter
        if (sigma<n)
            dcount++; //deficient counter
        if (sigma == n)
            pcount++; //perfect counter 

        System.out.print(acount + " " + "\t" + " " + dcount + "\t" + "   " + pcount + "\t" + "   " + p); //prints abundant column
        System.out.println();

        if (condition.equals("limit"))
        {   
            if(n<value)
                n++;
            else
                break;
        }

        if(condition.equals("abundant")) 
        {
            if(acount<value)
                n++;
            else
                break;
        }

        if (condition.equals("deficient"))
        {    
            if (dcount<value)    
                n++;
            else
                break;
        }

        if (condition.equals("perfect"))
        {
            if (pcount<=value)
                n++;
            else
                break;
        }

        if (condition.equals("prime"))
        {    
            if (p<value)
                n++;
            else
                break;
        }
    }
}
}

Essentially, the code is supposed to print out 5 columns: n, abundant, deficient, perfect, and prime. And each row will have a column of numbers under it. The user is supposed to type in specifications in a 'condition = value' format. So if they type in limit = 10 then it will print 10 rows. And if they input abundant = 10 then it will continue to print rows until the value of abundant reaches 10. The problem I am encountering is that my program will infinity loop when I input certain values and I am not sure what the cause is. For example, if I input deficient = 2 it will work fine but if I input deficient = 10 then it will start an infinite loop. However, when I input perfect = 10 it will only print out 1 row. Like my title says I am a beginner and I can't figure out what is causing the error. Any suggestions?


Solution

  • Try initializing the value of sigma inside the loop:

    while (stop)
    {    
        sigma = 0;
        ...
    }
    

    Since sigma is never reset to zero, it just keeps growing for every number. So you will quickly stop finding deficient numbers or perfect numbers, and everything will be be abundant. That's why the abundant keyword works, but deficient does not.