一 寫在前面
1.1 本文內容
一個關於素數的性質。
二 素數性質
性質:所有大於等於5的素數一定和6的倍數相鄰!此性質可以被證明,證明方法可以去搜索相關資料。下面給出1000以內的素數,你可以驗證一下看是不是這樣。

有了這個性質,下面再給出一個其在質因數分解中的實際應用例子。題目鏈接在此。題目大意是給定一個正整數N,要求將其分解成多個質因數相乘的形式。需要注意的是質因數分解的常用算法是試除法,例子中使用的也是試除法。並且每一個合數都能夠寫成幾個質因數相乘的形式。
質因數分解:http://oj.noi.cn/oj/#main/show/1170
上述題目的一個可行代碼如下:
1 #include <stdio.h> 2 #include <stdbool.h> 3 4 int main(int argc, char *argv[]) 5 { 6 //freopen("in.txt", "r", stdin); 7 int n, step; 8 bool first = true; 9 10 scanf("%d", &n); 11 12 /* 將數n中包含的2, 3, 5這三個質因數給除去 */ 13 while (n % 2 == 0) 14 { 15 (first == true) ? printf("2") : printf("*2"); 16 first = false; 17 n /= 2; 18 } 19 while (n % 3 == 0) 20 { 21 (first == true) ? printf("3") : printf("*3"); 22 first = false; 23 n /= 3; 24 } 25 while (n % 5 == 0) 26 { 27 (first == true) ? printf("5") : printf("*5"); 28 first = false; 29 n /= 5; 30 } 31 32 /* 讓step從6開始,考察step相鄰的兩個數,如果能整除n,則將其除去 */ 33 step = 6; 34 while (n >= (step-1)) 35 { 36 if (n % (step-1) == 0) 37 { 38 (first == true) ? printf("%d", step-1) : printf("*%d", step-1); 39 first = false; 40 n /= (step-1); 41 } 42 else if (n % (step+1) == 0) 43 { 44 (first == true) ? printf("%d", step+1) : printf("*%d", step+1); 45 first = false; 46 n /= (step+1); 47 } 48 else 49 { 50 step += 6; 51 } 52 } 53 54 putchar('\n'); 55 //fclose(stdin); 56 return 0; 57 }
