---
# System prepended metadata

title: 質數題目

---

# 質數題目

:::spoiler 完整程式

```c=
#include <stdio.h>

int main(){
    int input = 0;
    int detection = 0; // 0 = false, 1 = true
    printf("enter a number: ");
    scanf("%d", &input);

    for (int i = input - 1; i > 1; i --){
        if(input % i == 0){
            detection = 1;
            break;
        }
    }

    if(detection == 1){
        printf("%d is not a prime number\n", input);
    }
    else{
        printf("%d is a prime number\n", input);
    }

    return 0;
}
```
:::

## 概念
用for迴圈，i一開始等於 「輸入的數字-1」，重複條件是 「大於1」，持續變小，迴圈中如果input「模除」{i|持續變小}等於0，代表這個數可以被整除，也就代表這個數不是質數

>模除：模數除法，簡單來說就是取餘數
> >a % b = c
> >就是 a ÷ b = {x|商} ... c

我用一個整數 {detection|偵測的英文} 當作儲存判斷的地方，如果detection等於1就代表他不是質數

## ChatGPT
在C語言中判斷一個數字是否為質數，除了您提到的模除方法外，還有一些其他的方法可以使用。這裡介紹幾種常見的方法：

1. **平方根方法**：這是對模除方法的一種優化。由於一個非質數必然有一個因數不大於其平方根，所以只需要檢查到該數字的平方根即可。這大大減少了迴圈的次數。

   ```c
   #include <math.h>
   #include <stdbool.h>

   bool isPrime(int number) {
       if (number <= 1) return false;
       for (int i = 2; i <= sqrt(number); i++) {
           if (number % i == 0) return false;
       }
       return true;
   }
   ```

2. **埃拉托斯特尼篩法（Sieve of Eratosthenes）**：這是一種找出一定範圍內所有質數的高效方法。它的原理是從2開始，先找到第一個質數2，然後去除2的所有倍數，再找到下一個質數並去除其倍數，依此類推。

   ```c
   #include <stdbool.h>
   #include <string.h>

   void sieveOfEratosthenes(int n, bool prime[]) {
       memset(prime, true, sizeof(bool) * (n+1));
       prime[0] = prime[1] = false;
       for (int p = 2; p*p <= n; p++) {
           if (prime[p] == true) {
               for (int i = p*p; i <= n; i += p)
                   prime[i] = false;
           }
       }
   }
   ```

   使用這個方法，可以高效地找出一定範圍內的所有質數，然後可以直接檢查某個數字是否為質數。

3. **6k±1規則**：除了2和3之外的所有質數，都可以表示成6k±1的形式（k是一個自然數）。基於這個規則，我們可以只檢查形式為6k±1的數字，這也是一種優化。

   ```c
   bool isPrime(int number) {
       if (number <= 1) return false;
       if (number <= 3) return true;

       if (number % 2 == 0 || number % 3 == 0) return false;

       for (int i = 5; i * i <= number; i += 6) {
           if (number % i == 0 || number % (i + 2) == 0) return false;
       }
       return true;
   }
   ```

這些方法各有優缺點，可以根據具體的應用場景選擇合適的方法。平方根方法適合單次判斷質數，埃拉托斯特尼篩法適合大規模篩選質數，6k±1方法則在某些情況下能提供更好的性能。