暗夜妖姬 發表於 2026-1-11 15:45:07

Java中判断一个数是否为素数(质数)的方法实例

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>素数的定义</li><li>素数的例子</li><li>素数的性质</li><li>判断素数的方法</li><li>方法优化</li><li>进一步优化:跳过偶数</li><li>总结</li></ul></div><p class="maodian"></p><h2>素数的定义</h2>
<p>素数是指大于1的自然数,除了1和它本身外,没有其他正因数。换句话说,素数只能被1和它自身整除。</p>
<p class="maodian"></p><h2>素数的例子</h2>
<p>常见的素数包括2、3、5、7、11、13等。2是唯一的偶数素数,其他偶数(如4、6、8等)均不是素数,因为它们可以被2整除。</p>
<p class="maodian"></p><h2>素数的性质</h2>
<ul><li><strong>唯一分解定理</strong>:任何大于1的自然数都可以唯一地分解为素数的乘积。</li><li><strong>无限性</strong>:素数有无限多个,这一结论最早由欧几里得证明。</li><li><strong>分布规律</strong>:素数在自然数中的分布不均匀,但随着数值增大,素数出现的频率逐渐降低(素数定理)。</li></ul>
<p class="maodian"></p><h2>判断素数的方法</h2>
<p><strong>试除法</strong>:根据上面对素数性质的理解,我们可以联想到最简单的判断方式,就是一个数,从1开始往后一个数一个数的去做除法,直到它本身,如果都没有能被除尽(没有余数),则这个数就是素数</p>
<div class="jb51code"><pre class="brush:java;">public static boolean isPrime(int n) {//n表示传入需要判断的数
    if (n &lt;= 1) {//如果小于1不是素数,直接返回
      return false;
    }
    for (int i = 2; i &lt; n; i++) {//从除数2开始往后除,一直到n本身
      if (n % i == 0) {//如果n能被i整除(无余数),则这个数不是素数
            return false;
      }
    }
    //当所有的数字都除完了,没有一个i能整除n,则是素数
    return true;
}

</pre></div>
<p>通过上面的代码可以做到素数的判断,但是这样的判断效率非常的慢,如果需要判断的素数非常的大,一个一个的从1开始除,则需要浪费很多时间,我们可以引入一个<span>变量count</span>来计数一下,总共</p>
<p>进行了多少次循环</p>
<div class="jb51code"><pre class="brush:java;">public static boolean isPrime(int n) {
    if (n &lt;= 1) {
      return false;
    }
    int count = 0;// 初始化计数器
    for (int i = 2; i &lt; n; i++) {
      count++;   // 每次循环递增计数器
      if (n % i == 0) {
            System.out.println("count: " + count);// 输出循环次数
            return false;
      }
    }
    System.out.println("count: " + count);// 输出循环次数
    return true;
}

</pre></div>
<p>例如我们需要判断52087这个数字是否为素数,可以看到count如下:</p>
<div class="jb51code"><pre class="brush:java;">count: 50285
</pre></div>
<p>可以看到需要循环的次数非常的多,那么我们有没有可以进行优化的方法呢?</p>
<p>有的兄弟,有的</p>
<p class="maodian"></p><h2>方法优化</h2>
<p>上述方法可以进一步优化,减少循环次数:</p>
<div class="jb51code"><pre class="brush:java;">public static boolean isPrime(int n) {
      int count = 0;
      for (int i = 2; i &lt;= Math.sqrt(n) ; i++) {//Math.sqrt(n)指的是n开根号
            count++;
            if (n % i == 0) {
                return false;
            }
      }
      System.out.println(count);
      return true;</pre></div>
<p>在这个方法中,我们可以看到在for循环中除数的结束循环发生了变化,在上一个方法中结束的条件是循环到判断数<span><strong>n本身</strong></span>的位置,在这个方法中则是变成了<strong><span>&radic;n</span></strong><span>,这个怎么去理解呢?</span></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/202601111546171.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/202601111546172.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/202601111546173.png" /></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/202601111546174.png" /></p>
<p>我们可以观察上图,四个数中的因子,都是成对出现的,我们以36为例子,36的平方根是<strong><span>6</span></strong>,</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/202601111546175.png" /></p>
<p>我们可以发现,左边<span><span>绿色部分</span></span>的数,都是<strong>小于</strong>平方根的,右边<span><span>蓝色部分</span></span>的数都是<strong>大于</strong>平方根的,平方根把因子平均分为了两组,且两组都是一一对应的,那我们就可以只需要看一边就能判断这个数是否为素数了,不需要再去看大的数目了,所以这时候<strong>循环结束条件</strong>的最大值就可以定为<strong><span>&radic;n</span></strong><span>,直接省略掉了一半需要判断的数目,提高了效率</span></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011115350740.png" /></p>
<p><span>需要注意</span>的是此处的判断条件从<strong><</strong>变成了<strong><=</strong>,因为我们还需要判断平方根本身</p>
<p>通过上述方法,便可以轻松的判断一个数是否为素数啦</p>
<p>当然还有更进一步的优化</p>
<p class="maodian"></p><h2>进一步优化:跳过偶数</h2>
<p>除2外,素数均为奇数,所以因子就不会有偶数了,可跳过偶数除数。</p>
<div class="jb51code"><pre class="brush:java;">public static boolean isPrime(int n) {
    if (n &lt;= 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (int i = 3; i &lt;= Math.sqrt(n); i += 2) {//每次+2,跳过除数为偶数的判断
      if (n % i == 0) return false;
    }
    return true;
}

</pre></div>
<p><strong>效果</strong>:循环次数再减半。</p>
<p class="maodian"></p><h2>总结</h2>
<ul><li><strong>基础方法</strong>:简单但低效,适合教学理解。</li><li><strong>平方根优化</strong>:显著减少循环次数,适用于多数场景。</li><li><strong>跳过偶数</strong>:进一步提升效率,尤其适合大数判断。</li></ul>
<p>到此这篇关于Java中判断一个数是否为素数(质数)的文章就介绍到这了,更多相关Java判断素数内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Java判断101-200之间有多少个素数并输出</li><li>Java两个乒乓球队比赛名单问题(判断素数)</li><li>java如何判断一个数是否是素数(质数)</li><li>使用java判断101-200之间有多少个素数并输出</li><li>Java中判断素数的五种有效方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Java中判断一个数是否为素数(质数)的方法实例