如果一正整数的真因数的和是其本身,我就称它为完全数。
/*
《寻找完全数》
古人只知道4个完全数:6、28、496、8128;
古希腊的欧几里得在他的《几何原本》中,
证明了在公式[2^(n-1)]*[(2^n)-1]中,
每当[(2^n)-1]是个质数的時候,就产生一个偶完全数。
两千年后,瑞士伟大的数学家欧拉,
证明了这个定理的逆定理也成立,即:
若m是个偶完全数,則m=[2^(n-1)]*[(2^n)-1],其中[(2^n)-1]是质数。
这样现在人已知的偶完全数只有30个,当n为:
2、3、5、7、13、19、31、61、89、107、127、521、607、
1279、2203、2281、3217、4253、4423、9689、9941、11213、
19937、21701、23209、44497、86243、132049、216091。
其中最后一个 m=[2^(216091-1)]*[(2^216091)-1],
是在1986年发现的,这个数字长达 13万位。
"算法"
*/
/* 算法3 */
/* 超高速欧拉定理"完全数搜索算法" */
/* 本算法由宝石哥哥独立完成,如有雷同不构成侵权 */
/* 您可以自由复制和使用代码,请保留作者信息 */
/* (C)2003 宝石哥哥 2003.11.13 */
#include
#define MAX_P 16
typedef unsigned int UINT;
UINT IsP(UINT n)
{
UINT i;
if (n==0) return 0;
if (n==1) return 0;
if (n==2) return 1;
for (i=3;i*i<=n;i+=2)
{
if (n%i==0) return 0;
}
return 1;
}
UINT Fn(UINT n)
{
UINT i, p=1;
for (i=0;i
return p;
}
void func03(void)
{
UINT n, f;
for (n = 2; n < MAX_P; ++n)
{
if (IsP(n))
{
f = Fn(n-1);
if (IsP(f*2-1))
{
UINT n = f*(f*2-1);
UINT i;
printf ("\n%9u = ", n);
for (i=1; i<=n/2; ++i)
if (n%i==0)printf (" %d", i);
}
}
}
}
void main(void)
{
func03();
}
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=951949