如何用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));
}