最后一次是出了素数的问题C语言解决题目(面试),当时用了最粗暴的算法。回来细致參考资料,事实上答案有非常多种:

1,小学生版本号:

推断 x 是否为质数,就从 2 一直算到 x-1。

static rt_uint32_t array1[ARRAY_LEN];

void func1(void)

{

for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)

{

array1[i - 1] = 0;

}

rt_uint32_t x, y = 0, z = 0;

rt_uint32_t i = 0;

for (x = 2; x <= ARRAY_LEN; x++)

{

y = 0;

for (i = 1; i <= x; i++)

{

if (x % i == 0)

{

y++;

}

}

if (y == 2)

{

z++;

array1[x - 1] = x;

}

}

array1[0] = 1;

}

2,小学生毕业版:

x 假设有质因数,肯定会小于等于 x/2。所以捏。就从 2 一直到 x/2 就可以。

static rt_uint32_t array2[ARRAY_LEN];

void func2(void)

{

for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)

{

array2[i - 1] = 0;

}

rt_uint32_t x, y = 0, z = 0;

rt_uint32_t i = 0;

for (x = 3; x <= ARRAY_LEN; x++)

{

y = 0;

for (i = 2; i <= x / 2; i++)

{

if (x % i == 0)

{

y++;

break;

}

}

if (y == 0)

{

z++;

array2[x - 1] = x;

}

}

array2[0] = 1;

array2[1] = 2;

}

3,初中生版:

除了2以外的质因数都是奇数。

所以算从3開始一直到 x/2 的全部奇数。

static rt_uint32_t array3[ARRAY_LEN];

void func3(void)

{

for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)

{

array3[i - 1] = 0;

}

rt_uint32_t x, y = 0, z = 0;

rt_uint32_t i = 0;

for (x = 3; x <= ARRAY_LEN; x += 2)

{

y = 0;

for (i = 2; i <= x / 2; i++)

{

if (x % i == 0)

{

y++;

break;

}

}

if (y == 0)

{

z++;

array3[x - 1] = x;

}

}

array3[0] = 1;

array3[1] = 2;

}

4,高中生版:

事实上仅仅要从 2 一直尝试到根号x。就能够了。由于x仅仅要有因数必然有一个因数小于等于根号x。

static rt_uint32_t array4[ARRAY_LEN];

void func4(void)

{

for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)

{

array4[i - 1] = 0;

}

rt_uint32_t x, y = 0, z = 0;

rt_uint32_t i = 0;

for (x = 3; x <= ARRAY_LEN; x++)

{

y = 0;

for (i = 2; i <= sqrt(x); i++)

{

if (x % i == 0)

{

y++;

break;

}

}

if (y == 0)

{

z++;

array4[x - 1] = x;

}

}

array4[0] = 1;

array4[1] = 2;

}

5,本科生版:

把上面的版本号都综合起来

static rt_uint32_t array5[ARRAY_LEN];

void func5(void)

{

for (rt_uint32_t i = 1; i <= ARRAY_LEN; i++)

{

array5[i - 1] = 0;

}

rt_uint32_t x, y = 0, z = 0;

rt_uint32_t i = 0;

for (x = 3; x <= ARRAY_LEN; x += 2)

{

y = 0;

for (i = 2; i <= sqrt(x); i++)

{

if (x % i == 0)

{

y++;

break;

}

}

if (y == 0)

{

z++;

array5[x - 1] = x;

}

}

array5[0] = 1;

array5[1] = 2;

}

6。本科生毕业版本号:

就是当i是质(素)数的时候,i的全部的倍数必定是合数。

假设i已经被推断不是质数了,那么再找到i后面的质数来把这个质

数的倍数筛掉。

static rt_uint32_t array6[ARRAY_LEN];

void func6(void)

{

for (rt_uint32_t i = 1; i <= ARRAY_LEN; i += 2)

{

array6[i - 1] = i;

}

for (rt_uint32_t i = 3; i < sqrt(ARRAY_LEN); i+=2)

{

if (array6[i-1])

{

for(rt_uint32_t j=i<<2;j<=ARRAY_LEN;j+=i)

{

array6[j] = 0;

}

}

}

array6[1] = 2;

}

总结

分析了6个算法在我的嵌入式平台执行结果:

定义ARRAY_LEN = 1000;

func1

2513922

func2

221563

func3

213926

func4

762945

func5

674993

func6

14663

我们能够看到func4、func5并没有我们想象的那么节省时间,我想问题主要出在sqrt上面;sqrt本身是比較耗时的计算,然后func4与func5调用sqrt的次数又比較多;所以导致结果不太乐观。

当然假设把ARRAY_LEN调大。可能结果又会不一样

至此,也就仅仅是我本科毕业的水准了,后面还有更好的纯C算法可以告诉我。

c语言的求素数算法,C语言求素数的算法相关推荐

  1. 求素数的三大算法 —— C 语言 篇

    求素数的三大算法 -- C 语言 篇 文章目录 求素数的三大算法 -- C 语言 篇 算法一 :暴力遍历 思路: 代码: 算法二:折半范围遍历 思路: 代码: 算法三:根号范围遍历 思路: 代码: 总 ...

  2. C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。

    1. 题目 编写函数int function(int lim,int aa[max]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数. 2 .温馨提示 C语 ...

  3. C语言primcount素数计数,C语言与汇编的嵌入式编程:求100以内素数

    写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include void main(){ int i,j; int count=; for(i=;i<=;i+ ...

  4. c语言编程最大公约数穷举发,C语言基本算法 :1.求最大公约数与最小公倍数

    C语言基本算法 :1.求最大公约数与最小公倍数 一.最大公约数: 最大公约数目前有三种求法:更相减损术.辗转相除法以及穷举法. 1.更相减损术: 算法介绍:设两个整数数a和b,以较大数减较小数,得出的 ...

  5. c语言十万以内超级素数,用C语言求素数的优化

    用C语言求素数的优化 这个程序运行了8个小时,求一亿以内的素数和超级素数. 大家帮忙看看,我求一亿以内的素数和超级素数.从下午5:30开始,一直到零晨0点30才结束.我的电脑配置也可以.INTER E ...

  6. c语言求n到m之间的素数和

    c语言求n到m之间的素数和 要实现的功能如下 完整源代码实现如下 要实现的功能如下 求n到m所有的素数,并对素数进行求和. 完整源代码实现如下 #include <stdio.h> #in ...

  7. C语言求两个链表的合并点的算法(附完整源码)

    C语言求两个链表的合并点的算法 C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) #include < ...

  8. C语言求一万以内的超级素数,用C语言求素数的优化.doc

    用C语言求素数的优化 用C语言求素数的优化 这个程序运行了8个小时,求一亿以内的素数和超级素数. 大家帮忙看看,我求一亿以内的素数和超级素数.从下午5:30开始,一直到零晨0点30才结束.我的电脑配置 ...

  9. 求100以内的素数(c语言)

    求100以内的素数(c语言) 素数的概念 素数:该数除1及其本身不再有其它的因数 2为最小的素数 代码: #include<stdio.h> void main(){for(int num ...

  10. 【C++,C语言,Java】判断一个数是否为素数,并求出100-200间的所有素数

    要求:设计一个程序,求出100-200间的所有素数,要求每行输出五个素数.判断一个数是否为素数用一个函数来实现. C++实现: #include<iostream> using names ...

最新文章

  1. 取代MybatisPlus?阿里推出了新 ORM 框架!(两者对比参考)
  2. Task03——零基础入门NLP - 基于机器学习的文本分类
  3. [YTU]_2489( C++结构体之统计最高最低分)
  4. vue项目搜索历史功能的实现
  5. 平衡二叉树(AVL)--查找、删除、插入(Java实现)
  6. codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...
  7. Spring - 理解BeanDefinition
  8. 项目进度计划表_18份施工进度计划图 | 开工必备,都给你整理好了
  9. 微信公众平台、微信开放平台、微信商户平台的区别
  10. Python读取Excel未隐藏的数据
  11. 项目实战之电子商城数据库源码
  12. C++实现龙贝格求积分算法
  13. 记一次武汉科技大学ctf新手赛 wuctf2020
  14. Bokeh—通过plotting绘制图形
  15. Apple 设备尺寸
  16. 20154312 曾林 EXP9 Web安全基础
  17. 谷歌中国人才流失 遭猎头公司不断挖角
  18. 米兔机器人自主编程_米兔积木机器人编程编写指南.pdf
  19. HGU3336 Count the string (KMP Next数组的应用)
  20. 通过API获取ip地址以及城市和运营商

热门文章

  1. 淘宝获取单笔订单信息服务端调用API及流程
  2. 2022-2028年中国电压力锅市场投资分析及前景预测报告
  3. 2022-2028年中国手术室设备行业市场研究及前瞻分析报告
  4. 数据结构与算法——线性结构——线性表及其表示
  5. linux 文件查找与文件中注释去除
  6. 【运维学习笔记】运维入门
  7. 谷歌BERT预训练源码解析(一):训练数据生成
  8. Bert系列(三)——源码解读之Pre-train
  9. 特征提取,转换和选择
  10. 用小神经网络和光谱仪优化关键词识别