2
  1. 重い素数は、複数の素数のペアの合計であると定義されます。素数とは、約数が 1 とそれ自体だけである 1 より大きい数であることを思い出してください。たとえば、16=3+13 および 5+11 であるため、16 は素数が重いです (3、5、11、および 13 はすべて素数であることに注意してください)。24 = 5+19、7+17、11+13 であるため、24 はプライム ヘビーです。ただし、8 = 3+5 であるため、合計が 8 になる素数のペアは他にないため、8 は素数重ではありません。 isPrimeHeavy という名前の関数を作成し、引数が素数重の場合は 1 を返し、それ以外の場合は 0 を返します。関数のシグネチャは int isPrimeHeavy ( int n) 引数が素数の場合に 1 を返す isPrime という名前の関数が既に存在すると想定することができます。この関数を呼び出すことはできますが、記述する必要はありません。

私はこれをしましたが、重い素数を返すことはできません.素数を返すだけです...

public class Prime {

    public static boolean isPrimeHeavy(int n) {
        if (n <= 1) {
            return false;
        }
        if (n == 2) {
            return true;
        }
        for (int i = 2; i <= Math.sqrt(n) + 1; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
    public static boolean isPrimeHeavy(int n) {
        if (n <= 1) {
            return false;
        }
        if (n == 2) {
            return true;
        }
        if (n % 2 == 0) {
            return false;
        }
        for (int i = 3; i <= Math.sqrt(n) + 1; i = i + 2) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
}

public class PrimeTest {

    public PrimeTest() {
    }

    @Test
    public void testIsPrime() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {

        Prime prime = new Prime();
        TreeMap<Long, String> methodMap = new TreeMap<Long, String>();


        for (Method method : Prime.class.getDeclaredMethods()) {

            long startTime = System.currentTimeMillis();

            int primeCount = 0;
            for (int i = 0; i < 1000000; i++) {
                if ((Boolean) method.invoke(prime, i)) {
                    primeCount++;
                }
            }

            long endTime = System.currentTimeMillis();

            Assert.assertEquals(method.getName() + " failed ", 78498, primeCount);
            methodMap.put(endTime - startTime, method.getName());
        }


        for (Entry<Long, String> entry : methodMap.entrySet()) {
            System.out.println(entry.getValue() + " " + entry.getKey() + " Milli seconds ");
        }
    }
}
4

3 に答える 3

5

単一のループを使用して、可能なすべての最初の値を試し、2 番目の値を計算できます。ペアが複数ある場合は 1 を返し、それ以外の場合は 0 を返します。

プログラミングではなく数学なので、ヒントとしてこれを示しました。Project Euler では、このような問題を見つけることができます。私見 数学の役割に就いている場合を除き、数学の問題を解決する方法を知っているとは期待されるべきではありませんが、プロの開発者であればコードを書くことができるはずです。

于 2012-07-30T12:46:26.570 に答える
1
if((argument % 2 == 0 && argument > 12) || argument == 10) {
    return 1;
} else {
    return 0;
}
于 2012-07-30T16:09:54.210 に答える
0
public class Prime {

    public static boolean isPrimeHeavy(int n) {
        if (n % 2 != 0) {
            return false;
        }
        int found = 0;
        for (int i = n-3; i >= (n/2); i -= 2) {
            if (isPrime(i) && isPrime(n - i)) {
                found++;
                if (found == 2)
                    return true;
            }
        }
        return false;
    }
}
于 2012-07-30T14:14:20.773 に答える