1

「for」ループを使用して、28以降の最初の3つの完全数を見つけるにはどうすればよいですか。これが私が使っているコードです。

2つを超える数字は何も得られないようです。i <= 2000000000を増やすと、整数が大きすぎることがわかります。

public class JBaneling
{
    public static void main(String args[])
    {
        System.out.println("3 nearest Perfect numbers after 29 ");

        for (int i = 29; i <= 2000000000; i++) {
            test1(i);
        }
    }



    public static void test1(int number)
    {
        int sum = 0;

        for(int divisor=1; divisor < number; divisor++)
        {
            if ((number % divisor) ==0)
            {
                sum = sum + divisor;
            }
        }

        if(sum==number)
        {
            System.out.println(number + " is a perfect number");
        }
    }
}
4

2 に答える 2

4

コードが実際に終了したことを確認しますか?実際の計算には何の問題もありませんが、ひどく非効率的です。したがって、2つの数値しか得られない場合は、3番目の数値に達する前にプログラムを停止したことが原因である可能性があります。ご参考までに、これは33550336であり、設定したループ制限をはるかに下回っています。

于 2012-07-01T19:22:58.147 に答える
4

3番目の完全数を計算するのに長い時間がかかります。8128次の完全数の後はです33550336。ここで、コードが、の間のすべての整数を、それらの各整数の除数を8128 ... 33550336計算することによってテストしていると考えてください。

また、この次の完全数33550336は、javaで表すことができる最大の完全数であると考えてくださいintInteger.MAX_VALUEis(2 ^ 31-1)。--is (2 ^ 63 --1)-を使用すると、さらにいくつか取得できますが、その8番目の完全数を長時間待つことになります。longLong.MAX_VALUE

の平方根までの除数を検討し、平方根の上で一致する除数を見つけるだけでよいことに注意してください。ただし、numberそれでも、次の完全数に到達するまでに非常に長い時間を待つ必要があります。

于 2012-07-01T19:23:16.327 に答える