| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1198 人关注过本帖, 2 人收藏
标题:给大家比较下
只看楼主 加入收藏
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
结帖率:88%
收藏(2)
已结贴  问题点数:100 回复次数:16 
给大家比较下
孪生素数问题
                                                  时间限制:3000 ms  |  内存限制:65535 KB
描述
写一个程序,找出给出素数范围内的所有孪生素数的组数。一般来说,孪生素数就是指两个素数距离为2,近的不能再近的相邻素数。有些童鞋一看到题就开始写程序,不仔细看题,咱们为了遏制一下读题不认真仔细的童鞋,规定,两个素数相邻为1的也成为孪生素数。
输入
第一行给出N(0<N<100)表示测试数据组数。
接下来组测试数据给出m,表示找出m之前的所有孪生素数。
(0<m<1000000)
输出
每组测试数据输出占一行,该行为m范围内所有孪生素数组数。
样例输入
1
14


一下是三个算法:
算法一:
#include "stdio.h"
#include "math.h"
int main()
{
  int n,m;
  bool isprime(int n);
  scanf("%d",&n);
while(n--)
{
  int count=0,i=3;
  scanf("%d",&m);
  if(m>2)count++;
  while(i<=m-2)
  {
    if(isprime(i)&&isprime(i+2))count++;
    i=i+2;
  }   
     printf("%d",count);      
}
  return 0;
      
}
bool isprime(int n)
{
    if(n < 2) return false;

    for(int i =2; i<=sqrt(n); ++i)
        if(n%i == 0) return false;

    return true;
}


算法二:
#include<stdio.h>
#include<math.h>
int a[1000005];
int main()
{
int is_prime(int n);
int i,j,n;
for(i=2,j=0;i<1000005;i++)
{
if(is_prime(i))
{
a[j]=i;
j++;
}
}
scanf("%d",&n);
while(n--)
{
int m,p,q,count=0;
scanf("%d",&m);
if(m==0||m==1)
{
printf("0\n");
continue;
}
for(i=1;a[i]<=m;i++)
{
if((a[i]-a[i-1]==1)||(a[i]-a[i-1]==2))
count++;

}
printf("%d\n",count);


}
return 0;

}
int is_prime(int n)
{
int flag=0,i;

if(n==1||n<=0)
return 0;
else
{
for(i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
flag=1;
break;
}

}
if(!flag)
return 1;
else
return 0;
}
}


算法三:
#include <iostream>
#include<math.h>
using namespace std;
bool vis[1000010];
int main()
{
int n=1000010;
int m =sqrt(n+0.5);
int c=0;
for(int i =2;i<=m;i++)
if(!vis[i])
{
for (int j = i*i;j<=n;j+=i)
vis[j]=1;
}
cin>>n;
while(n--)
{
int count=0,m;
cin>>m;
for(int i=3;i<m-1;i++)
{
if(!vis[i] && !vis[i+2]) count++;
}
if(m>3)
cout<<count+1<<endl;
else if(m==3) cout<<"1"<<endl;
else cout<<"0"<<endl;
}
return 0;
}

看看算法的时间复杂度
搜索更多相关主题的帖子: 童鞋 
2013-10-03 16:18
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:8 
学习
2013-10-03 18:01
qunxingw
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:24
帖 子:1676
专家分:7295
注 册:2011-6-30
收藏
得分:8 
渐好

www.qunxingw.wang
2013-10-03 18:30
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:8 
按平均时间复杂度来计算

思考赐予新生,时间在于定义
2013-10-03 18:58
青春无限
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3452
专家分:19340
注 册:2012-3-31
收藏
得分:8 
学习

学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能
2013-10-03 19:20
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:8 
按计算一次的时间复杂度计算:

第一个算法:m^1.5
第二个算法:m^1.5,常数应该是第一个算法的1/2
第三个算法:mloglogm,第三个算法肯定最好

考虑多次运行的情况:
第一个算法:Sum(m^1.5)
第二个算法:Maxm^1.5+Sum(m)
第三个算法:MaxmloglogMaxm+Sum(m)

明显第三个最好
2013-10-03 19:44
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:8 
第三个算法是普通素数筛的改进版,效率比普通素数筛大概高一倍,但没有本质差别。

小曹对第三个算法的时间复杂度描述是否存在笔误(loglog ?)?我计算的结果是m * ln(m)。如果不是笔误请写一下推导过程,我看看我错在哪里

关于第三段代码发表点个人意见。素数的判别算法用的不错,但孪生素数的统计部分不尽如人意。

不需要对每组输入都重新统计,进行一次统计即可。在时间复杂度上只是增加了一个可以忽略的m而已。

设C[i]表示0到i之间的孪生素数组数,P[i]表示i是否是素数(1是0否)。则 C[i] = C[i - 1] + (P[i] && P[i - 2]);

初始条件C[0,1,2] = 0,C[3] = 1。

重剑无锋,大巧不工
2013-10-04 20:42
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
这个筛法的时间复杂度是我记得从哪里看到过的,是MloglogM(以e为底),具体推导我也不会,估计应该比较复杂吧,不知道怎么推导
2013-10-04 22:15
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 8楼 czz5242199
嗯,你的描述是对的。我在推导的过程中忽略了“if(!vis[i])”,即素数分布的影响。素数定理x/π(x)≈lnx。把这个加进去就是你的式子了。

素数定理确实不是你我能推导证明得了的

重剑无锋,大巧不工
2013-10-04 22:44
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:8 
偷懒点用测时间函数运行下,做个参考。。。

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-10-05 08:02
快速回复:给大家比较下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016614 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved