知道什么是完全数吗?完全数又称为完美数,因为它有如下特别的性质:例如6,它有约数1, 2, 3(不算它自身在内),这三个约数的和刚好也是它本身。现在就要你找出这些数
输入
多组测试数据,一组里只有一行,就是一个n(1<=n<=5e18)
输出
1到n的所有完全数,一个数占一行
样例输入:
30
样例输出:
6
28
view plaincopy to clipboardprint?
/*
二千年前的欧几里得及18世纪的数学家欧拉证明了偶完全数只能是2^(k-1)*(2^k-1)这里 k=2或k是奇数。
通过题目要求1<=n<=5e18;由2^(k-1)*(2^k-1)<=5e18,可得出: k<=31;
这里设计到一个猜想:完全数的个位数或十位数是否是6或28;
具体证明方法请参考:[url]http://www.pep.com.cn:82/200503/ca679589.htm[/url]
因为:2^11-1=2047; 2^23-1=8388607;2^29-1=536870911;不满足上叙猜想条件。故舍去。
由此得到关于k取值的数组: a[8]={2,3,5,7,13,17,19,31};
*/
#include <iostream>
#include <cmath>
int main()
{
int a[8]={2, 3, 5, 7, 13, 17, 19, 31};
__int64 n;
while(scanf("%I64d", &n) != EOF)
{
__int64 l, pn;
for(int i = 0; i < 8; i++)
{
l=(__int64)pow(2, a[i]) - 1;
pn=(l + 1) / 2 * l;
if(pn > n)
break;
else
printf("%I64d/n", pn);
}
}
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/nash635/archive/2010/04/16/5491303.aspx