擅长:python、mysql、java
<p>所以看看程序,它似乎得到了<code>n</code>的所有素数因子,并返回最大的一个。让我们一次看一行:</p>
<pre><code>while i * i < n:
</code></pre>
<p>这段代码一开始看起来像是一个错误,但是当你意识到{<cd1>}在不断变小时,它就起作用了。程序使用重复除法将<code>n</code>还原为其最大素数因子。在</p>
^{pr2}$
<p>操作<code>n % i</code>返回<code>n / i</code>的剩余部分。所以如果<code>n % i == 0</code>,那么{<cd7>}的当前值可以均匀地分成{<cd1>},即{<cd7>}是{<cd1>}的因子。在</p>
<pre><code>n = n / i
</code></pre>
<p>在这里,我们不断地将<code>n</code>除以<code>i</code>;我们将继续这样做,直到<code>while</code>条件不再为真。我们需要尽可能多地进行分割,因为这样可以消除任何可能的复合因素。例如,如果给定的数字是24,我们将它除以2三次,最终使<code>n</code>等于3。这消除了任何可能的2的倍数的复合因子。在</p>
<pre><code>i = i + 1
</code></pre>
<p>增加我们的数字,然后重复。在</p>
<p>这很有效,因为通过反复使用<code>n = n / i</code>,我们可以从<code>n</code>中连续删除更大的素数因子。我们消除的这些素数越多,<code>n</code>就越小,直到它最终被除1之外的任何东西都不可分割。此时,<code>n</code>等于原始数的最大素数因子,因此我们返回它。在</p>
<p>现在我们的停车条件也变得更有意义了。当<code>n</code>变为素数(最大素数因子)时,就没有{<cd7>}的值,我们可以得到它是均匀可除的。当<code>i * i</code>大于<code>n</code>-如果你有一个复合数,那么其中一个因子必然是<code>>= n^1/2</code>。在</p>
<p>正如Ionut Hulub所提到的,如果<code>n</code>是任何完美的正方形,则此特定解决方案将失败。为了防止这种情况的发生,您应该同时打印出<code>n</code>和平均除以该数的最大的<code>i</code>。在</p>