2
  1. 素数重数定义为多于一对素数之和。回想一下,素数是一个大于 1 的数,其唯一的除数是 1 和它自己。例如,16 是重质数,因为 16=3+13 和 5+11(请注意,3、5、11 和 13 都是质数)。24 是素数,因为 24 = 5+19、7+17 和 11+13。但是,8 不是重质数,因为 8 = 3+5 但没有其他素数对等于 8。编写一个名为 isPrimeHeavy 的函数,如果它的参数是重质数,则返回 1,否则返回 0。函数签名是 int isPrimeHeavy ( int n) 你可以假设一个名为 isPrime 的函数已经存在,如果它的参数是素数则返回 1。您可以调用此函数,但不必编写它。

我这样做了,但它不能返回一个重质数......只返回一个质数......

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

您可以使用单个循环来尝试所有可能的第一个值,然后您可以计算第二个,当您发现不止一对时,返回 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 回答