求出3到50w范围内所有的素数。

这类问题在C语言题目中经常会遇见。同样,大素数的研究对于密码学也起到了重要的作用。那么对于C语言的初学者,该如何编写程序计算素数呢?

1.

首先从素数的定义来看,“一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数”。除了一和他自身外,没有其他因数,那么最粗暴的算法就出来了:

遍历所有所有大于一,小于他自身的整数,如果没有数能整除他,他就是素数。

#include

#include

int

main(){

int i,j,a,b;

a=clock();

for(i=3;i<500000;i++){

for(j=2;j

if(i%j==0){

goto table;

}

}

table:;

}

b=clock();

printf("%d\n",b-a);

return 0;

}

上述代码就是实现了这个算法,当出现因数,直接跳到下一个数字。

经过测试,执行该代码的时间是33449ms。

明显对于一个求素数的算法来说,时间太长了。如果范围扩大到5000000,甚至50000000,耗费时间更是无法想象。那么如何去改进呢?

2.

让我们再从定义去看。“因数”,我们要寻找的是除了自身与1没有因数的数字。而除了自身的平方根,因数都是成对存在的。而且这些因数对,一定是一大一小(除平方根)。那么我们只要保留上面的遍历,但将遍历的最大值设为所有因数对较小值中的最大值就可以了。只要这个值不存在,就说明该数字不存在因数对。那么自然也就是素数了。

#include

#include

#include

int main(){

int i,j,a,b;

a=clock();

for(i=3;i<500000;i++){

for(j=2;j<=sqrt(i);j++){

if(i%j==0){

goto table;

}

}

table:;

}

b=clock();

printf("%d\n",b-a);

return 0;

}

因数对中的较小值的最大值,自然就是其自身的平方根了。在这之后的因数都能对应一个在这之前的因数。所以如果在这之前没有因数,那么在这之后也同样没有因数。

这可以说是个相当大的改进了,大大减少了遍历次数,程序执行时间为234ms。

3.

除了2以外,所有的素数都是奇数。那么我们就可以先将偶数排除,再来判定质数

#include

#include

#include

int main(){

int i,j,a,b;

a=clock();

for(i=3;i<500000;i++){

if(i%2==0) goto table;

for(j=3;j<=sqrt(i);j+=2){

if(i%j==0){

goto table;

}

}

table:;

}

b=clock();

printf("%d\n",b-a);

return 0;

}

因为先一步排除了偶数, 所以寻找因数便不必再遍历偶数因数。因为奇数的因数一定是奇数。

进一步的优化,现在程序执行时间仅有109ms。

4.

我们做数学题时,都知道平方根并不好算。同样对于计算机来说,平方根计算也会消耗大量时间。所以我们可以先一步计算平方根,以使其不用在每次比较时都去计算。

#include

#include

#include

int main(){

int i,j,a,b;

double sq;

a=clock();

for(i=3;i<500000;i++){

if(i%2==0) goto table;

sq=sqrt(i);

for(j=3;j<=sq;j+=2){

if(i%j==0){

goto table;

}

}

table:;

}

b=clock();

printf("%d\n",b-a);

return 0;

}

这样程序的执行时间又缩短了一倍,现在只有46ms了。

5.

不要以为数论就是一堆没用的理论知识。算术基本定理,现在是用上它的时候了。

任何一个大于1的自然数

N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积。

那么我们只需要遍历素数因数就好了嘛。

至于能成为因数的0素数有哪些呢?

不要忘了我们是从小到大寻找的素数,现在可以用到前面的结果了。#include

#include

#include

int ar[300000];

int main(){

int i,j,k=0,a,b;

double sq;

a=clock();

for(i=3;i<500000;i++){

if(~i&1) goto table;

sq=sqrt(i);

for(j=0;ar[j]<=sq&&j

if(i%ar[j]==0){

goto table;

}

}

ar[k]=i;

k++;

table:;

}

b=clock();

printf("%d\n",b-a);

return 0;

}

把前面每一个素数放入一个数组,以此来寻找素数因数。

现在整个程序的执行时间只需要15ms了!

从最开始的3万3千毫秒,到现在的15毫秒,整整缩短了2200多倍。可见算法对于一个程序是多么重要。

最后再贴上一段程序,思考一下这一段与上一段有什么区别,以及为什么要这么做

#include

#include

#include

int

ar[300000];

int

main(){

int i,j,k=0,a,b;

double sq;

ar[0]=2;

a=clock();

for(i=3;i<5000000;i++){

if(~i&1) goto table;

sq=sqrt(i);

for(j=0;ar[j]<=sq;j++){

if(i%ar[j]==0){

goto table;

}

}

ar[k]=i;

k++;

table:;

}

b=clock();

printf("%d\n",b-a);

return 0;

}

整数n分解成素数乘积c语言,关于几种求素数的方法(C语言描述)相关推荐

  1. 整数n分解成素数乘积c语言,用C语言和汇编语言实现将1个整数分解成几个素数的乘积...

    任何1个大于2的整数都可以分解成几个素数的乘积.将1个整数分解成几个素数的乘积是个热门话题. 经常有人问到.本文试图用C语言和32位X86汇编语言给出一个比较好的实现.希望对c语言学习者和 汇编语言学 ...

  2. 用C语言实现将1个整数n分解成几个素数的乘积

    问题的提出:将一个整数分解素因数 根据算术基本定理,任何大于2的正整数都可以表示为素数的乘积,如果不考虑这些素数出现的次序,其 表示方式为唯一的.本题目的要求是输入一个正整数,将这个正整数显示为几个素 ...

  3. 整数n分解成素数乘积c语言,C程序实现整数的素数和分解问题

    本文以实例形式讲述了C程序实现整数的素数和分解问题,分享给大家供大家参考之用.具体方法如下: 要求:对于一个给定的整数,输出所有这种素数的和分解式,对于同构的分解只输出一次(比如5只有一个分解2+3, ...

  4. C语言 埃氏筛法求素数

    题目 用埃拉托色尼筛选法求素数,n(<1000)由用户输入.每行输出5个: 原理 首先将0.1排除: 对于初始队列{2,3,4,5,6,7,8,9,10,11,12,13,14--n},操作步骤 ...

  5. 随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程

    本发明涉及评分领域及机器学习领域,它特别涉及一种基于随机森林的c语言源代码静态评分的构建方法. 背景技术: c语言源代码静态评分是指对根据一定的题目描述做出解答的c语言源代码进行评分.目前,主要流行的 ...

  6. c语言程序设计 简述操作系统管理文件的方法,C语言程序设计基础实验.doc

    C语言程序设计基础实验.doc 实验1 熟悉c语言程序的开发环境 1.1 实验目的 (1)熟悉Code::Blocks等C语言程序的开发环境. (2)掌握C程序的编辑.编译.连接和运行方法. (3)通 ...

  7. java后端语言,后端开发语言哪一种比较好?后端开发语言比较

    网络开发语言是一种编程语言,用于支持并维系一个网站的建设,使用一个高级合理的编辑语言,能够帮助您更快的进行网络建设开发.然而,在网络建设时,网络建设开发师常常为了选择哪一种网络开发语言而发愁,下面小编 ...

  8. python判断素数的函数_如何用python求素数

    如何用python求100以内的素数? 质数(primenumber)又称素数,有无限个.质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数,如:2.3.5.7.11.13.1 ...

  9. C语言char*s 4,求讲解几道C语言的题 52 声明语句为“char s[4][15],*p1,**p2;int x,*y;”,下列语句中正...

    求讲解几道C语言的题 52 声明语句为"char s[4][15],*p1,**p2:int x,*y:",下列语句中正 2018-6-15来自ip:14.144.15.70的网友 ...

最新文章

  1. LeetCode Peeking Iterator
  2. 软件测试自动化的成功经验
  3. 编写一个程序,将一串字符倒序存放后输出。
  4. e-mobile帐号状态存在异常_一文掌握异常检测的实用方法 | 技术实践
  5. 脚本比别人的代码都多
  6. 海外并购频频被阻 中国芯发展之路困难重重
  7. 使用DirectoryEntry进行 IIS 操作
  8. git和SVN的区别
  9. 冲击、碰撞试验测试技术——冲击传感器的校准
  10. 英文名为什么最好不用joe?JOE英文名的寓意是什么?
  11. 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?
  12. FlyAI小课堂:Fbank和MFCC介绍-理论和代码
  13. jupyter notebook无法连接python3服务器内核 一直显示正在连接服务器
  14. 基础工具组件starter-idempotent-redission设计与实现
  15. 感谢csdn 2021年中秋月饼礼盒
  16. 使用ajax报405错误
  17. log4j日志信息配置文件详解
  18. ISA防火墙中的防火墙客户身份验证
  19. MySQL期末复习题和答案
  20. python编写一个接口,链接mysql数据库查询数据

热门文章

  1. 一台电脑同时配置github私人账户和公司账户
  2. moore 数据集_【数据集】一文道尽医学图像数据集与竞赛
  3. 蜂窝数据app只剩两个_蜂窝和无线网络探戈需要两个时间
  4. 反射(Reflection)
  5. JavaScript: 世界上最被误解的语言|Douglas Crockford
  6. 清华大学环境工程专业考研经验分享
  7. USB OTG连接方式
  8. 如何获取数组中嵌套对象中属性值不为空的对象?
  9. 全面了解三极管——三极管基本参数总结
  10. I2C+E2PROM再回顾ing~