素数问题三步曲_HDOJ2098
偶然间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~N的数。2 3 4 5 6 7 8 9 10 11 12 ...N
- 先将2的倍数筛选出去(一定不为素数)2 3 5 7 9 11 13 17 19...N
- 将3的倍数筛选出去(一定不为素数)2 3 5 7 11 13 17 19...N
- 即不断对当前剩下的数列中最前面的数的倍数从数列中筛选出去,最后剩下的数列即为所有比N小的素数序列。
欧拉线性筛选法
我们可以发现在Eratorthenes筛选法中,30,这个数,在215中被筛了一次,在56中又被重复筛了,所以对于此处可以进行优化修改。但是我对于其中算法关键看了一会不是很懂,目前就暂时不写吧。
素数问题三步曲_HDOJ2098的更多相关文章
- Membership三步曲之进阶篇 - 深入剖析Provider Model
Membership 三步曲之进阶篇 - 深入剖析Provider Model 本文的目标是让每一个人都知道Provider Model 是什么,并且能灵活的在自己的项目中使用它. Membershi ...
- Membership三步曲之入门篇 - Membership基础示例
Membership 三步曲之入门篇 - Membership基础示例 Membership三步曲之入门篇 - Membership基础示例 Membership三步曲之进阶篇 - 深入剖析Pro ...
- [转]Membership三步曲之入门篇 - Membership基础示例
本文转自:http://www.cnblogs.com/jesse2013/p/membership.html Membership三步曲之入门篇 - Membership基础示例 Members ...
- 第七章 new的三步曲
这章是本系列文章的重点,这章揭示了js对象的真正本质 看下面的事例 var a = new b(); 等价于 ①var a={}; ②a.__proto__=b.prototype; ③b.call( ...
- SQL Server2005 表分区三步曲(zz)
前言 SQL Server 2005开始支持表分区,这种技术允许所有的表分区都保存在同一台服务器上.每一个表分区都和在某个文件 组(filegroup)中的单个文件关联.同样的一个文件/文件组可以容纳 ...
- ASP.NET 安全系列 Membership三步曲之入门篇 - Jesse Liu
Membership 三步曲 ASP.NET 安全系列 Membership三步曲之入门篇 ASP.NET 安全系列 Membership三步曲之进阶篇 ASP.NET 安全系列 Membership ...
- OpenGL ES2.0编程三步曲 -转
原地址:http://blog.csdn.net/myarrow/article/details/7707943 1. 保存全局变量的数据结构 以下例子程序均基于Linux平台. typedef st ...
- VC控件自绘制三步曲
http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处 ...
- STM32中断编程三步曲教你弄会中断设置以及中断优先级设置
中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...
随机推荐
- synchronized 的局限性 与 Lock 的优点
我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多局限性, ...
- android 布局文件中xmlns:android="http://schemas.android.com/apk/res/android"
http://blog.163.com/benben_long/blog/static/199458243201411394624170/ xmlns:android="http://sch ...
- 转://Oracle补丁及opatch工具介绍
一. CPU(Critical Patch Update) 一个CPU内包含了对多个安全漏洞的修复,并且也包括相应必需的非安全漏洞的补丁.CPU是累积型的,只要安装最新发布的CPU即可,其中包括之前发 ...
- JDK文档中关于Semaphore的正确使用以及使用场景
import java.util.concurrent.Semaphore; /** * * JDK文档使用备注:<br> * Semaphores are often used to r ...
- Qt 编程指南 7 添加背景
. #include "QT_Text1.h" #include <QtWidgets/QApplication> #include <QBitmap> i ...
- ucml 子业务组件与行为参与者业务组件
- 树莓派设置NTP同步
pi@raspberrypi:~ $ sudo timedatectl set-ntp true--------------启用NTPpi@raspberrypi:~ $ date ...
- Ubuntu16.04下安装配置phpmyadmin
在项目配置了阿里的druid,可以监控session,spring和详细sql的执行情况以及具体到表等信息,但是仍然发现不够详细,而且作为一个半吊子dba,一直用linux命令分配权限和管理数据库,效 ...
- centos时区设置
[root@ logs]# tzselect Please identify a location so that time zone rules can be set correctly.Pleas ...
- FreeRTOS学习笔记--任务优先级
FreeRTOSConfig.h 中的常量configMAX_PRIORITIES的值就是任务优先级的最大数值,这个数值可以按照自己的需要改动,当然值越大,内核对内存的开销就越大,一般设置一个满足自己 ...