一个关于素数的神奇性质

Posted laizhenghong2012

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个关于素数的神奇性质相关的知识,希望对你有一定的参考价值。

一 写在前面

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 }

 

以上是关于一个关于素数的神奇性质的主要内容,如果未能解决你的问题,请参考以下文章

一篇不大正经的有关素数的小结

梦工场实验室 素数求和 神奇的素数筛选

zoj 1562 反素数 附上个人对反素数性质的证明

[数论系列] 素数篇

cf584DDima and Lisa(素数性质,三素数,哥德巴赫猜想)

CodeForces937B:Vile Grasshoppers(素数性质)