刚刚学了一种新的素数筛选法,效率比原先的要高一些,据说当n趋近于无穷大时这个的时间复杂度趋近O(n)。本人水平有限,无法证明。

这是道水题,贴代码出来重点是欧拉筛选法。我把原来普通的筛选法贴出来。

//2013-11-07-22.30
//poj 2909
#include <stdio.h>
#include <string.h> const int maxn = (1<<15)+5;
bool vis[maxn];
int pr[3416];
int cnt = 1;
void getpr()
{
for (int i = 2; i < maxn; i++)
{
if (vis[i] == 0)
pr[cnt++] = i;
for (int j = 1; j < cnt; j++)
{
if (i*pr[j] > maxn)
break;
vis[i*pr[j]] = 1;
if (i%pr[j] == 0)
break;
}
}
}
//void getpr()
//{
// for (int i = 2; i < maxn; i++)
// {
// if (vis[i])
// continue;
// else
// pr[cnt++] = i;
// for (int j = i<<1; j < maxn; j += i)
// vis[j] = true;
// }
//}
int main()
{
int n;
getpr();
while (scanf("%d", &n) && n)
{
int m = n>>1;
int ans = 0;
for (int i = 1; i < cnt; i++)
{
if (pr[i] > m)
break;
if (vis[n-pr[i]] == 0)
ans++;
}
printf("%d\n", ans);
}
return 0;
}

我把vis改成int型,然后对代码稍微改了一下 ,增加了计算总共访问过多少次vis数组的功能,欧拉筛法共访问29258次,而普通筛分访问了80298次,明显效率更低一些,改动代码如下,有兴趣可以自己试试。

//2013-11-07-22.30
//poj 2909
#include <stdio.h>
#include <string.h> const int maxn = (1<<15)+5;
int vis[maxn];
int pr[3416];
int cnt = 1; //void getpr() //欧拉筛法
//{
// for (int i = 2; i < maxn; i++)
// {
// if (vis[i] == 0)
// pr[cnt++] = i;
// for (int j = 1; j < cnt; j++)
// {
// if (i*pr[j] > maxn)
// break;
// vis[i*pr[j]]++;
// if (i%pr[j] == 0)
// break;
// }
// }
//}
void getpr() //普通筛法
{
for (int i = 2; i < maxn; i++)
{
if (vis[i])
continue;
else
pr[cnt++] = i;
for (int j = i<<1; j < maxn; j += i)
vis[j]++;
}
}
int main()
{
int n;
getpr();
int sum = 0;
for (int i = 1; i < maxn; i++)
sum += vis[i];
printf("sum = %d\n", sum); while (scanf("%d", &n) && n)
{
int m = n>>1;
int ans = 0;
for (int i = 1; i < cnt; i++)
{
if (pr[i] > m)
break;
if (vis[n-pr[i]] == 0)
ans++;
}
printf("%d\n", ans);
}
return 0;
}

最新文章

  1. WPF文章资源库
  2. Redis主-从部署实践
  3. Django入门之自定义页面
  4. 国际化(i18n)
  5. 《C++Primer》复习——with C++11 [1]
  6. SSH与SSL
  7. gif格式的图片不能存在与包含js目录的路径中?
  8. Axure快捷键大全
  9. USB OTG介绍(转载)
  10. SQL字符串转换为数组
  11. 关于iOS开发首次进入需要获取地理位置
  12. Android Studio 工具栏添加常用按钮
  13. C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .
  14. MySQL 中添加列、修改列以及删除列
  15. XSS过滤JAVA过滤器filter 防止常见SQL注入
  16. 死磕 java集合之CopyOnWriteArrayList源码分析
  17. luogu P5286 [HNOI2019]鱼
  18. sqlserver 表循环-游标、表变量、临时表
  19. Java初学者的30个常见问题
  20. 10 Rules of Highly Successful Project Management

热门文章

  1. Flume —— 安装部署
  2. GitLab通过API创建项目
  3. X-Admin&amp;ABP框架开发-数据字典
  4. 2019.6.5 NOIP2014 day2 t2 寻找道路
  5. 利用consul在spring boot中实现最简单的分布式锁
  6. 基于C#的机器学习--深层信念网络
  7. web项目超时方案
  8. 完全平方数(C语言实现)
  9. hive merge into 批量更新测试
  10. 码云及Git的使用