判断10000000以内素数的方法---进化过程

一:暴力求解(直接根据素数的定义)

//返回1:是素数;返回0:非素数

int isPrime(int n)
{
  int i;

  if(n<2) return 0;
  for(i=2;i<n;i++)
    if(n%i==0) return 0;
  return 1;
}

然而想要通过此方法快速获得10000000以内的素数总数的话,难......
二:除去部分因数求解(平方根和偶数助力)

首先,能被2整除的数----非素数;

其次,举例数36,开方得6。好,我们来看看25可以分解成哪些因数。
    正序来看,36=1*36=2*18=3*12=4*9=6*6;

    反序来看,36=36*1=18*2=12*3=9*4=6*6;

  再举一个例,24,开方不能得到一个整数,近似于4或5,设为x(较小值)和y(较大值);

    正序来看,24=1*24=2*12=3*8=4*6

    反序来看,24=24*1=12*2=8*3=6*4

举这两个例子是想说明要是我们在判断某数是否为素数时,如果在判断某数如果除以它的平方根后依旧不能被整除,那么就可判断该数为素数;

  像24的平方根不是整数时,使用sqrt函数不能确保某数开方得到的是x还是y,那么判断范围扩大到sqrt函数得到的数+1即可确保。

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

三:制表法进阶(开一个内存,利用指针)

设某数x,如果判断到x的质因数为a,b,c.......那么此时将凡是a,b,c....的倍数均做上标记;

下次遇见直接跳过;

 

不可避免地需要使用数组。但如果想开容量很大的数组(如10000000),编译器不能接受?(...猜测溢出?)

所以尝试使用指针;

 

int prime(int n)
{
  int counts;
  int i;

  //使用指针

  unsigned char *prime =(unsigned char*)malloc(n+1);
  for(i=2;i<n;i++)
    prime[i]=1;
  for(i=2;i<=n;i++)
  {
    if(prime[i])
    {
      counts++;
      for(int j=i+i;j<n;j+=i)
      prime[j]=0;
    }
  }
  free(prime);
  printf("%d",counts);
  return 0;
}

posted @   蟹蟹蟹蟹  阅读(531)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示