一個關於素數的性質。算法
性質:全部大於等於5的素數必定和6的倍數相鄰!此性質能夠被證實,證實方法能夠去搜索相關資料。下面給出1000之內的素數,你能夠驗證一下看是否是這樣。spa
有了這個性質,下面再給出一個其在質因數分解中的實際應用例子。題目連接在此。題目大意是給定一個正整數N,要求將其分解成多個質因數相乘的形式。須要注意的是質因數分解的經常使用算法是試除法,例子中使用的也是試除法。而且每個合數都可以寫成幾個質因數相乘的形式。code
質因數分解:http://oj.noi.cn/oj/#main/show/1170blog
上述題目的一個可行代碼以下:get
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 }