求质数(素数)算法和代码

1,小学生版本:

判断 x 是否为质数,就从 2 一直算到 x-1。 如果这道题目有10分,按照这种方式做出的代码,即便正确无误,也只能给1分。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static rt_uint32_t array1[ARRAY_LEN];  
  2. void func1(void)  
  3. {  
  4.     for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)  
  5.     {  
  6.         array1[i - 1] = 0;  
  7.     }  
  8.   
  9.     rt_uint32_t x, y = 0, z = 0;  
  10.     rt_uint32_t i = 0;  
  11.     for (x = 2; x <= ARRAY_LEN; x++)  
  12.     {  
  13.         y = 0;  
  14.         for (i = 1; i <= x; i++)  
  15.         {  
  16.             if (x % i == 0)  
  17.             {  
  18.                 y++;  
  19.             }  
  20.         }  
  21.         if (y == 2)  
  22.         {  
  23.             z++;  
  24.             array1[x - 1] = x;  
  25.         }  
  26.     }  
  27.     array1[0] = 1;  
  28. }  

2,小学生毕业版:

x 如果有质因数,肯定会小于等于 x/2,所以捏,就从 2 一直到 x/2 即可。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static rt_uint32_t array2[ARRAY_LEN];  
  2. void func2(void)  
  3. {  
  4.     for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)  
  5.     {  
  6.         array2[i - 1] = 0;  
  7.     }  
  8.   
  9.     rt_uint32_t x, y = 0, z = 0;  
  10.     rt_uint32_t i = 0;  
  11.     for (x = 3; x <= ARRAY_LEN; x++)  
  12.     {  
  13.         y = 0;  
  14.         for (i = 2; i <= x / 2; i++)  
  15.         {  
  16.             if (x % i == 0)  
  17.             {  
  18.                 y++;  
  19.                 break;  
  20.             }  
  21.         }  
  22.         if (y == 0)  
  23.         {  
  24.             z++;  
  25.             array2[x - 1] = x;  
  26.         }  
  27.     }  
  28.     array2[0] = 1;  
  29.     array2[1] = 2;  
  30. }  

3,初中生版:

除了2以外的质因数都是奇数。所以算从3开始一直到 x/2 的所有奇数。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static rt_uint32_t array3[ARRAY_LEN];  
  2. void func3(void)  
  3. {  
  4.     for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)  
  5.     {  
  6.         array3[i - 1] = 0;  
  7.     }  
  8.   
  9.     rt_uint32_t x, y = 0, z = 0;  
  10.     rt_uint32_t i = 0;  
  11.     for (x = 3; x <= ARRAY_LEN; x += 2)  
  12.     {  
  13.         y = 0;  
  14.         for (i = 2; i <= x / 2; i++)  
  15.         {  
  16.             if (x % i == 0)  
  17.             {  
  18.                 y++;  
  19.                 break;  
  20.             }  
  21.         }  
  22.         if (y == 0)  
  23.         {  
  24.             z++;  
  25.             array3[x - 1] = x;  
  26.         }  
  27.     }  
  28.     array3[0] = 1;  
  29.     array3[1] = 2;  
  30. }  

4,高中生版:

其实只要从 2 一直尝试到根号x,就可以了。因为x只要有因数必定有一个因数小于等于根号x。
简单解释一下:因数都是成对出现的。比如,100的因数有:1和100,2和50,4和25,5和20,10和10。看出来没有?成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。至于严密的数学证明,用小学数学知识就可以搞定。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static rt_uint32_t array4[ARRAY_LEN];  
  2. void func4(void)  
  3. {  
  4.     for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)  
  5.     {  
  6.         array4[i - 1] = 0;  
  7.     }  
  8.   
  9.     rt_uint32_t x, y = 0, z = 0;  
  10.     rt_uint32_t i = 0;  
  11.     for (x = 3; x <= ARRAY_LEN; x++)  
  12.     {  
  13.         y = 0;  
  14.         for (i = 2; i <= sqrt(x); i++)  
  15.         {  
  16.             if (x % i == 0)  
  17.             {  
  18.                 y++;  
  19.                 break;  
  20.             }  
  21.         }  
  22.         if (y == 0)  
  23.         {  
  24.             z++;  
  25.             array4[x - 1] = x;  
  26.         }  
  27.     }  
  28.     array4[0] = 1;  
  29.     array4[1] = 2;  
  30. }  

5,本科生版:

把上面的版本都综合起来
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static rt_uint32_t array5[ARRAY_LEN];  
  2. void func5(void)  
  3. {  
  4.     for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)  
  5.     {  
  6.         array5[i - 1] = 0;  
  7.     }  
  8.   
  9.     rt_uint32_t x, y = 0, z = 0;  
  10.     rt_uint32_t i = 0;  
  11.     for (x = 3; x <= ARRAY_LEN; x += 2)  
  12.     {  
  13.         y = 0;  
  14.         for (i = 2; i <= sqrt(x); i++)  
  15.         {  
  16.             if (x % i == 0)  
  17.             {  
  18.                 y++;  
  19.                 break;  
  20.             }  
  21.         }  
  22.         if (y == 0)  
  23.         {  
  24.             z++;  
  25.             array5[x - 1] = x;  
  26.         }  
  27.     }  
  28.     array5[0] = 1;  
  29.     array5[1] = 2;  
  30. }  

6,本科生毕业版本:

就是当i是质(素)数的时候,i的所有的倍数必然是合数。如果i已经被判断不是质数了,那么再找到i后面的质数来把这个质
数的倍数筛掉。 筛法如何求质数,说起来很简单:
  首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数......
  上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。维基百科上有一张很形象的动画,能直观地体现出筛法的工作过程。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. static rt_uint32_t array6[ARRAY_LEN];  
  2. void func6(void)  
  3. {  
  4.     for (rt_uint32_t i = 1; i <= ARRAY_LEN; i += 2)  
  5.     {  
  6.         array6[i - 1] = i;  
  7.     }  
  8.   
  9.     for (rt_uint32_t i = 3; i < sqrt(ARRAY_LEN); i+=2)  
  10.     {  
  11.         if (array6[i-1])  
  12.         {  
  13.             for(rt_uint32_t j=i<<2;j<=ARRAY_LEN;j+=i)  
  14.             {  
  15.                 array6[j] = 0;  
  16.             }  
  17.         }  
  18.     }  
  19.     array6[1] = 2;  
  20. }  
  21. 不见图、请翻墙
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值