篩選法求素數&一般方法求素數&判斷一個數是否是素數

                                  篩選法求素數&一般方法求素數&判斷一個數是否是素數


1.判斷一個數是否是素數

 

#include<stdio.h>
#include<math.h>
int main()
{
	int n, i, k;
	printf("please enter a integer number");
	scanf_s("%d", &n);
	k = sqrt(n);
	for (i = 2; i < k; i++)
		if (n % i == 0)break;

	if (i <= k)printf("%d is not a prime number.\n", n);
	else printf("%d is a prime number.\n", n);
	return 0;
}
  • 運行結果


2.篩選法求素數(以求200以內素數爲例) 

 

1.解釋下什麼是篩選法?

        篩選法又稱篩法,具體做法是:先把N個自然數按次序排列起來。1不是質數,也不是合數,要劃去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第一個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第一個沒劃去的數是5,把5留下,再把5後面所有能被5整除的數都劃去。這樣一直做下去,就會把不超過N的全部合數都篩掉,留下的就是不超過N的全部質數。

2.程序步驟:

 

<1> 先將1挖掉(因爲1不是素數)。

<2> 用2去除它後面的各個數,把能被2整除的數挖掉,即把2的倍數挖掉。

<3> 用3去除它後面的各數,把3的倍數挖掉。

<4> 分別用5…各數作爲除數去除這些數以後的各數。

3.具體應用(求100以內的素數):

 

        基本思想是:把從1開始的、某一範圍內的正整數從小到大順序排列,把不是素數的數全部賦值爲0,最後只輸出不是零的數即素數。1不是素數,首先把它換爲0。剩下的數中選擇最小的數是素數,然後把它的倍數全部換爲0。依次類推,直到結束。

如有:

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
1不是素數,換爲0。剩下的數中2最小,是素數,然後把它的倍數全部換爲0,餘下的數是:
0 2 3 0 5 0 7 0 9 0
11 0 13 0 15 0 17 0 19 0
21 0 23 0 25 0 27 0 29 0
剩下的數中3最小,是素數,然後把它的倍數全部換爲0,如此下去直到所有的數都被篩完,求出的素數爲:






2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97      (載至路漫漫其修遠兮sjw

#include <stdio.h>
#include <math.h>
#define N 200
int main()
{
    int i, j, n, a[N+1];
    for (i = 1; i < N; i++)
    {
        a[i] = i;
    }
    a[0] = 0;
    for (i = 2; i <= sqrt(N); i++)//篩選
    {
        for (j = i + 1; j <=N; j++)
        {
            if (a[i] != 0 && a[j] != 0)
                if (a[j] % a[i] == 0)
                {
                    a[j] = 0;
                }
        }
    }
    printf("\n");
    for (i = 2, n = 0; i < N; i++)
    {
        if (a[i] != 0)
        {
            printf("%5d", a[i]);
            n++;
        }
        if (n == 10)//控制換行
        {
            printf("\n");
            n = 0;
        }
    }
    return 0;
}
  • 運行結果 


3.一般法求素數 (200以內)

     sqrt是求平方根的函數,其對參數的要求是雙精度,在執行時會自動將 i 轉換爲雙精度數,求出的函數值也是雙精度,再把它賦值給k,系統會自動捨棄小數部分,將整數部分賦給k。

#include <stdio.h>
#include <math.h>
#define N 200
int main()
{
    int i, j, k, n = 0;
    for (i = 101; i <= N; i = i + 2)
    {
        k = sqrt(i);
        for (j = 2; j <= k; j++)
        {
            if (i % j == 0)break;

        }if (j >= k + 1)
        {
            printf("%5d", i);
            n++;
        }
        if (n % 10 == 0)//控制換行
        {
            printf("\n");
        }
    }
    return 0;
}
  • 運行結果 

     作者也不知道爲什麼會有這麼多空行,有知道的大佬可以留言。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章