簡體   English   中英

這是我的 function,用於確定數字是否為素數。 我相信這是正確的,但它總是無法通過單元測試

[英]This is my function for determining if a number is prime. I believe it is correct, but it keeps failing a unit test

這是我的代碼塊,用於確定一個數字是否為質數,這實際上是一個簡單的問題。 但是,它沒有通過單元測試,我不知道為什么。 我嘗試了不同的原始變量類型,但無濟於事。 它通過了所有明確的測試用例,所以我不知道 n 的哪個值沒有正確檢查其主要狀態。

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

有問題的單元測試給出了結果:

java.lang.AssertionError:預期:783904569 實際:3149358104

這是單元測試代碼

    CRC32 check = new CRC32();
    for(int k = 0; k < 10_000_000; k++) {
        if(Primes.isPrime(k)) { check.update(k); }
    }
    assertEquals(783904569L, check.getValue());
}

我已經嘗試了一切合理的方法,包括以不同的方式重新編寫代碼,但它一直給出相同的答案。

你的isPime()有兩個錯誤:

  • isPrime(1) == 真
  • isPrime(2) == 假

如果將以下內容添加到方法的開頭,則測試通過:

if (n == 1) return false;
if (n == 2) return true;

您可以使用Sieve of Eratosthenes加快速度。

static final int MAX_PRIMES = 10_000_000 + 1;
static final boolean[] PRIMES = new boolean[MAX_PRIMES];
static {
    Arrays.fill(PRIMES, true);
    PRIMES[0] = PRIMES[1] = false;
    for (int i = 2, end = (int)Math.sqrt(MAX_PRIMES); i <= end; ++i)
        for (int j = i + i; j < MAX_PRIMES; j += i)
            PRIMES[j] = false;
}

public static boolean isPrime(int n) {
    return PRIMES[n];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM