篩選法求素數&一般方法求素數&判斷一個數是否是素數
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;
}
-
運行結果
作者也不知道爲什麼會有這麼多空行,有知道的大佬可以留言。