根据topcoder Link,我们需要计算直到数字的平方根来列出它的所有素数因子......现在我能够在下面的代码中证明我们做得正确直到我们在for loop ..但是我无法弄清楚为什么剩下的数字将是素数,即在我们离开循环之后if(n> 1)printf("%d",n);是什么让我烦恼..!你能不能给我一个正式的证据和例子......
void factor(int n)
{
int i;
for(i=2;i<=(int)sqrt(n);i++)
{
while(n % i == 0)
{
printf("%d ",i);
n /= i;
}
}
if (n > 1) printf("%d",n);
printf("\n");
}
答案 0 :(得分:1)
最初,该过程继续搜索小于其平方根的n
的最小因子。
如果它没有,那么n
是素数。因此打印出n
,因为它是最小的一个主要因素!
如果找到最小的因子,那么它必须是素数。如果不是,它是复合的并且具有较小的素因子 - 矛盾。
找到最小的素数因子将n除以该因子以消除它(记住它可能是n == i*i*i*...i*r
其中i是素因子而r是残差)。这就是while(n%i==0)
循环中发生的事情。
最后,我们n
持有该残留物。
所以现在我们想要r的最小素数因子。
我们知道最小的素因子是i。为什么?因为如果r的素因子小于i,那么我不是n的最小素因子。
因此我们可以通过r的试验分区来搜索i + 1到sqrt(r),以找到n的下一个最小素因子。 如果我们找不到任何且r> 1,那么r是最后的素因子。
继续归纳。
在每轮淘汰之后(进入while(n%i==0)
循环内),我们知道一个数字没有素因子&lt; = i。
答案 1 :(得分:0)
粗略地说,对于i
的每个因素n
,都有一个辅助因子i'
,即i*i'=n
,即n/i
。不失一般性假设i=min{i,i'}
。然后i<=sqrt(n)<=i'
成立。实施旨在仅在忽略i
的同时找到i'
;仅i
的搜索空间就足够了。
因素i
的每次出现都会被n /= i
语句取消,这意味着n
被因子i'
取代。这里有两个案例需要考虑。在第一种情况下,该因子是素数,这意味着在连续迭代中不会找到任何因子。在第二种情况下,因子是复合的;这意味着它的因子小于sqrt(i')<sqrt(n)
。
但是,此因子必须大于i
,因为i
循环已消除while
的所有出现。这意味着剩余因子位于i+1
和sqrt(n)
之间,这将在连续迭代中找到。