偶然间OJ上敲到一题素数问题便查询了相关算法。对于该类问题我个人学习分为三步曲:最笨的方法(TLE毫无疑问)->Eratosthrnes筛选法->欧拉线性筛选法

针对HDOJ2098这道题进行代码分析,发散性可以解决其他问题。

笨笨的方法(TLE)

#include<stdio.h>
#include<stdlib.h>
#include<string.h> int main()
{
int a,b,n;
while(1)
{
scanf("%d",&n);
// printf("这是输入的数:%d\n",n);
if(n==0) break;
int i=1,sum=0;
for(i=2;i<n/2;i++)
{
//判断i,n-i两者是否都是素数
int j=2,flag=0;
for(j=2;j<=i/2;j++)
{
if(i%j==0)
{
flag=1;
break;
}
}
// printf("第一次判断i是否为素数结束\n");
for(j=2;j<=(n-i)/2;j++)
{
if((n-i)%j==0||(n-i)==1)
{
flag=1;
break;
}
}
// printf("第二次判断n-i是否为素数结束\n");
if(flag==0)
{
// printf("此时i和n-i都是素数:%d %d\n",i,n-i);
sum++;
}
}
printf("%d\n",sum);
}
return 0;
}

Eratorsthenes筛选法(AC)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h> #define MAX 100000
bool num[10000]={false,false,true}; int main()
{
int n;
int i=0,j=0;
for(i=3;i<10000;i++)
{
//初始化所有的数都为素数
num[i]=true;
} //从2开始对所有素数的倍数置为false
for(i=2;i*i<10000;i++)
{
if(num[i]==true)
{
for(j=i*i;j<10000;j+=i)
{
num[j]=false;
}
}
}
//检测输出所有比10000小的素数序列
// for(i=1;i<10000;i++)
// {
// if(num[i]==true)
// printf("%d ",i);
// } while(1)
{
int cnt=0;
scanf("%d",&n);
if(n==0) break; for(i=2;i<n/2;i++)
{
if(num[i]==true&&num[n-i]==true)
{
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}

Eratorsthenes筛选法(复杂度nlogn)是素数问题中十分有名的解法:即要求N以下的所有为素数的数有多少个?我们需要检查到sqrt(n)是否存在素数即可。

  1. 假设有一个筛子存放1~N的数。2 3 4 5 6 7 8 9 10 11 12 ...N
  2. 先将2的倍数筛选出去(一定不为素数)2 3 5 7 9 11 13 17 19...N
  3. 将3的倍数筛选出去(一定不为素数)2 3 5 7 11 13 17 19...N
  4. 即不断对当前剩下的数列中最前面的数的倍数从数列中筛选出去,最后剩下的数列即为所有比N小的素数序列。

欧拉线性筛选法

我们可以发现在Eratorthenes筛选法中,30,这个数,在215中被筛了一次,在56中又被重复筛了,所以对于此处可以进行优化修改。但是我对于其中算法关键看了一会不是很懂,目前就暂时不写吧。

素数问题三步曲_HDOJ2098的更多相关文章

  1. Membership三步曲之进阶篇 - 深入剖析Provider Model

    Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...

  2. Membership三步曲之入门篇 - Membership基础示例

    Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 -  Membership基础示例 Membership三步曲之进阶篇 -  深入剖析Pro ...

  3. [转]Membership三步曲之入门篇 - Membership基础示例

    本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例   Members ...

  4. 第七章 new的三步曲

    这章是本系列文章的重点,这章揭示了js对象的真正本质 看下面的事例 var a = new b(); 等价于 ①var a={}; ②a.__proto__=b.prototype; ③b.call( ...

  5. SQL Server2005 表分区三步曲(zz)

    前言 SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上.每一个表分区都和在某个文件 组(filegroup)中的单个文件关联.同样的一个文件/文件组可以容纳 ...

  6. ASP.NET 安全系列 Membership三步曲之入门篇 - Jesse Liu

    Membership 三步曲 ASP.NET 安全系列 Membership三步曲之入门篇 ASP.NET 安全系列 Membership三步曲之进阶篇 ASP.NET 安全系列 Membership ...

  7. OpenGL ES2.0编程三步曲 -转

    原地址:http://blog.csdn.net/myarrow/article/details/7707943 1. 保存全局变量的数据结构 以下例子程序均基于Linux平台. typedef st ...

  8. VC控件自绘制三步曲

    http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处 ...

  9. STM32中断编程三步曲教你弄会中断设置以及中断优先级设置

    中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...

随机推荐

  1. mybatis的xml映射文件

    1,在进行统计查询时候,不想写映射的实体类,这时候设置返回的resultType类型是map <select id="getMap" resultType="jav ...

  2. BZOJ1024:[SCOI2009]生日快乐(DFS)

    Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕. 现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的 ...

  3. ClickHouse之Distributed Query Execution

    原文地址:https://clickhouse.yandex/docs/en/development/architecture/ 集群中的所有节点都是彼此独立的,当你在集群中的一个节点或者多个节点创建 ...

  4. 阿里巴巴android开发手册总结

    每天学习一点点 编程PDF电子书免费下载: http://www.shitanlife.com/code 1  2. 3. 4. 5. 6. 7.   8. 9  每天学习一点点 编程PDF电子书免费 ...

  5. go标准库的学习-net/rpc

    参考:https://studygolang.com/pkgdoc 导入方法: import "net/rpc" RPC(Remote Procedure Call Protoco ...

  6. Linux下 XordDos(BillGates)木马查杀记录

    最近朋友的一台服务器突然网络异常,cpu占用率暴表,登录上去一查,cpu占用300% 左右,流量异常,经过看查进程,获取信息最终确认为中了dos木马,经过几天的研究,基本上已经清除,以下是清理记录. ...

  7. Shell逻辑语句

    case esac 语句 参考 :https://blog.csdn.net/wu20093346/article/details/47210809 case ... esac 与其他语言中的 swi ...

  8. linux随手笔记(Centos为主)

    用户管理 1.用户管理配置文件 用户数据文件:/etc/passwd [root@CentOS-Test software]# grep test /etc/passwd test:x:500:500 ...

  9. SkylineGlobe 移动端开发测试

    基于SkylineGlobe提供的安卓版本SDK,在已有菜单中增加自定义内容,测试代码如下: 新增加文件ZhaoHeContainer.java package com.skyline.terraex ...

  10. C#中用OLEDB操作EXCEL时,单元格内容长度超过255被截断

    C#中Microsoft.ACE.OLEDB.12.0 驱动读取excel,会读取前8行来判定每列的数据类型,假如没有超过255个字符,那么会被设置为nvarchar(255),从第9行开始,超过25 ...