c语言的求素数算法,C语言求素数的算法
最后一次是出了素数的问题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语言求素数的算法相关推荐
- 求素数的三大算法 —— C 语言 篇
求素数的三大算法 -- C 语言 篇 文章目录 求素数的三大算法 -- C 语言 篇 算法一 :暴力遍历 思路: 代码: 算法二:折半范围遍历 思路: 代码: 算法三:根号范围遍历 思路: 代码: 总 ...
- C语言试题二十九之编写函数int function(int lim,int aa[max])求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数。
1. 题目 编写函数int function(int lim,int aa[max]),该函数的功能是求出小于或等于lim的所有素数并放在aa数组中,该函数返回所求的素数的个数. 2 .温馨提示 C语 ...
- C语言primcount素数计数,C语言与汇编的嵌入式编程:求100以内素数
写汇编之前,需要搞清楚C语言代码的写法,这里以最简单的算法举例说明 C代码如下: #include void main(){ int i,j; int count=; for(i=;i<=;i+ ...
- c语言编程最大公约数穷举发,C语言基本算法 :1.求最大公约数与最小公倍数
C语言基本算法 :1.求最大公约数与最小公倍数 一.最大公约数: 最大公约数目前有三种求法:更相减损术.辗转相除法以及穷举法. 1.更相减损术: 算法介绍:设两个整数数a和b,以较大数减较小数,得出的 ...
- c语言十万以内超级素数,用C语言求素数的优化
用C语言求素数的优化 这个程序运行了8个小时,求一亿以内的素数和超级素数. 大家帮忙看看,我求一亿以内的素数和超级素数.从下午5:30开始,一直到零晨0点30才结束.我的电脑配置也可以.INTER E ...
- c语言求n到m之间的素数和
c语言求n到m之间的素数和 要实现的功能如下 完整源代码实现如下 要实现的功能如下 求n到m所有的素数,并对素数进行求和. 完整源代码实现如下 #include <stdio.h> #in ...
- C语言求两个链表的合并点的算法(附完整源码)
C语言求两个链表的合并点的算法 C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) C语言求两个链表的合并点的算法完整源码(定义,实现,main函数测试) #include < ...
- C语言求一万以内的超级素数,用C语言求素数的优化.doc
用C语言求素数的优化 用C语言求素数的优化 这个程序运行了8个小时,求一亿以内的素数和超级素数. 大家帮忙看看,我求一亿以内的素数和超级素数.从下午5:30开始,一直到零晨0点30才结束.我的电脑配置 ...
- 求100以内的素数(c语言)
求100以内的素数(c语言) 素数的概念 素数:该数除1及其本身不再有其它的因数 2为最小的素数 代码: #include<stdio.h> void main(){for(int num ...
- 【C++,C语言,Java】判断一个数是否为素数,并求出100-200间的所有素数
要求:设计一个程序,求出100-200间的所有素数,要求每行输出五个素数.判断一个数是否为素数用一个函数来实现. C++实现: #include<iostream> using names ...
最新文章
- 取代MybatisPlus?阿里推出了新 ORM 框架!(两者对比参考)
- Task03——零基础入门NLP - 基于机器学习的文本分类
- [YTU]_2489( C++结构体之统计最高最低分)
- vue项目搜索历史功能的实现
- 平衡二叉树(AVL)--查找、删除、插入(Java实现)
- codeforces 贪心+优先队列_算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)...
- Spring - 理解BeanDefinition
- 项目进度计划表_18份施工进度计划图 | 开工必备,都给你整理好了
- 微信公众平台、微信开放平台、微信商户平台的区别
- Python读取Excel未隐藏的数据
- 项目实战之电子商城数据库源码
- C++实现龙贝格求积分算法
- 记一次武汉科技大学ctf新手赛 wuctf2020
- Bokeh—通过plotting绘制图形
- Apple 设备尺寸
- 20154312 曾林 EXP9 Web安全基础
- 谷歌中国人才流失 遭猎头公司不断挖角
- 米兔机器人自主编程_米兔积木机器人编程编写指南.pdf
- HGU3336 Count the string (KMP Next数组的应用)
- 通过API获取ip地址以及城市和运营商