Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用java使我的程序更快(完美数字查找器)?_Java_Perfect Numbers - Fatal编程技术网

如何用java使我的程序更快(完美数字查找器)?

如何用java使我的程序更快(完美数字查找器)?,java,perfect-numbers,Java,Perfect Numbers,我能快点找到吗?我试图用数组和其他算法使它更快,但没有一个能使它更快 public class Perfect{ static long perfectNumber; static long startTime = System.nanoTime(); static long endTime; static long mersenne; public static void main(String[] args) { long p =

我能快点找到吗?我试图用数组和其他算法使它更快,但没有一个能使它更快

public class Perfect{
    static long perfectNumber;
    static long startTime = System.nanoTime();
    static long endTime;
    static long mersenne;

    public static void main(String[] args) {

        long p = 2;
        while (p < 32) {
            if( p % 2 == 0&&p!=2){
                    p++;
            }
            else{
            if (isPrime(p) == true) {

                mersenne = (long) (Math.pow(2, p) - 1);
                if (isPrime(mersenne) == true) {
                    perfectNumber = (long) Math.pow(2, (p - 1)) * mersenne;
                    System.out.println(perfectNumber);
                }
            }
            p++;
        }

    }
        endTime = System.nanoTime();
        System.out.println("Time:   " + (endTime - startTime) + "ns"
                );
    }
    private static boolean isPrime(long testPrime) {


            for (long i = 3; i < Math.sqrt(testPrime); i += 2) {

                if (testPrime % i == 0) {

                    return false;
                }
        }

        return true;
    }
}
公共类完美{
静态长余数;
静态长startTime=System.nanoTime();
静态长时间;
静态长梅森;
公共静态void main(字符串[]args){
长p=2;
而(p<32){
如果(p%2==0&&p!=2){
p++;
}
否则{
if(isPrime(p)=真){
mersenne=(长)(数学pow(2,p)-1);
if(isPrime(mersenne)=true){
perfectNumber=(long)Math.pow(2,(p-1))*mersenne;
System.out.println(perfectNumber);
}
}
p++;
}
}
endTime=System.nanoTime();
System.out.println(“时间:”+(endTime-startTime)+“ns”
);
}
私有静态布尔值isPrime(长testPrime){
for(长i=3;i
您可以做一些小的改进-可能没有任何改进会对运行时间产生任何影响:

  • 使用
    p%2
    可能会导致除法-
    p&1
    不会,因此应该快一点
  • 您可以轻松地预先计算所有素数,直到达到合理的限制

  • Math.pow(2,x)
    等同于
    2这个问题似乎离题了,因为它是关于@Ruchira.Thx的,但我如何获得纳米时间?@user3056796-不要!做1000次,然后用毫秒。是的,我试过了,但我需要更多,所以我不能用那个。33550336 8589869056 137438691328 2305843008139952128使用
    biginger
    -
    biginger p=biginger.ONE.shiftLeft(i+2).减法(biginger.ONE).shiftLeft(i+1)。我可以把它放在哪里?(对不起,我是java初学者)
    
    for ( int i = 0; i < 10; i++ ) {
      long q = ((1 << (i+2)) - 1) << (i+1);
      // Printing BigIntegers in binary is easy.
      BigInteger bq = BigInteger.valueOf(q);
      System.out.println(q+" = "+bq.toString(2));
    }
    
    6 = 110
    28 = 11100
    120 = 1111000
    496 = 111110000
    2016 = 11111100000
    8128 = 1111111000000
    32640 = 111111110000000
    130816 = 11111111100000000
    523776 = 1111111111000000000
    2096128 = 111111111110000000000
    
    for ( int i = 0; i < 10; i++ ) {
      BigInteger p = BigInteger.ONE.shiftLeft(i+2).subtract(BigInteger.ONE).shiftLeft(i+1);
      System.out.println(p.toString(10)+" = "+p.toString(2));
      //long q = ((1 << (i+2)) - 1) << (i+1);
      //BigInteger bq = BigInteger.valueOf(q);
      //System.out.println("    "+bq.toString(10)+" = "+bq.toString(2));
    }