首页
社区
课程
招聘
[讨论]一个简单的算法问题
发表于: 2009-5-6 17:42 3260

[讨论]一个简单的算法问题

2009-5-6 17:42
3260
前天一朋友给了个简单的算法题,说是奥林匹克计算机比赛上的
回文10亿内的素数
要求:
1 可用任何语言
2 内存使用不能超过6M
3 运行不能超过15秒
当时第一就想到了这样:
#include  <iostream.h>
using nameplace std;
int main()
{
  unsigned long itotal=2;
  unsigned long itemp;
  unsigned long icount=0;
  bool bflag=false;
  for(bflag=true;itotal<=1000000000;itotal++)
     for(itemp=2;itemp<itotal;itemp++)
        if((itotal%itemp)!=0)
           ;
        else
        {
           bflag=false;
           break;
        }
     if(bflag=true)
        icount++;
  cout << "Result:" << icount << endl ;
  return 0;
}
后来一看他的要求就傻眼了,切不说内存使用,光是运行时间,普通的电脑半个月能运行完都不错了。
后来和朋友讨论了一下,想了半天写出如下代码:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long INT;
INT ntMap[] = {1,101,10001,1000001,100000001};
INT nPow10[] = {1,10,100,1000,10000,};
int isPrime(INT n)
{
    if (n<2) return 0;
    if (n%2==0) return 0;
    if (n%3==0) return 0;
    {
        INT nAdd[2] = {4,2};
        INT nSq = (INT)sqrt((double)n);
        for (INT i=5,a=0; i<=nSq; i+=nAdd[++a&1])
        {
            if (n%i==0) return 0;
        }
    }
    return 1;
}
void dfs(int nMax, INT sum=0, int ndeep=0)
{
    if (nMax<ndeep)
    {
        if (isPrime(sum))
            printf("%d,", sum);
    }else for (int n=0; n<10; ++n)
    {
        dfs(nMax, sum + ntMap[ndeep]*nPow10[nMax-ndeep]*n, ndeep+1);
    }
}
int main()
{
    for (int n=0; n<4; ++n)
    {
        dfs(n);
    }
    return 0;
}
写完后总感觉不够完美,请大家指教

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
晕,怎么木人鸟我呢
2009-5-6 22:18
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
3
采用Miller-Rabin判定吧。

http://en.wikipedia.org/wiki/Miller-Rabin
2009-5-6 22:23
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
谢谢老大,我好好看下这个
2009-5-6 22:26
0
雪    币: 993
活跃值: (442)
能力值: ( LV12,RANK:403 )
在线值:
发帖
回帖
粉丝
5
能解释一下这句话的具体要求吗?没看明白。
2009-5-6 22:47
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
就是让你算算10E内有多少不素数
2009-5-6 22:59
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
7
Miller-Rabin判定只能判定不是素数
不能确定一定是素数
那要是这样的话,效率也高不到哪去,15秒危险吧
2009-5-7 09:53
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
可以用已经找到的小于sqrt(n)的素数来筛选,而不是用所有小于sqrt(n)的数(如你代码中的加2或加4)

另外,搜索了一下,找到了一篇论文,印度理工学院计算机科学与工程学系的科学家马宁德拉·阿格拉瓦和他的两位在校本科生尼拉叶·卡雅尔和尼汀·萨克斯特纳的素数判定法,不过还没看懂他的方法,据说此法是革命性的方法,与传统的素数筛选办法不同。

你可以找找看。
2009-5-7 12:04
0
游客
登录 | 注册 方可回帖
返回
//