17963 完美数
时间限制:10000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: G++;GCC;VC
Description
圣经上写着:“神6天创造天地万有,第7日安歇。” 这个世界用6天创造,暗示这个创造是多么完美! 任何一个自然数的约数中都有1和它本身,而所有小于它本身的因数叫做这个自然数的真约数。例如,6的所有真约数 是1、2、3;8的所有真约数是1、2、4。如果一个数的真约数之和等于这个自然数本身,则这个自然数就称为完美数。 比如6就是一个完美数,而8却不是。 完美数只有6吗?还有一些,但找到的完美数是非常少的(完美的东西都比较稀缺),用沧海一粟来形容也不为过,因 为到目前为止,科学家们借助计算机的帮助也只找到约47个完美数,第一个完美数就是数字6。 实际上,在非常遥远的古代,古代数学家就开始探寻完美数了。公元前3世纪,古希腊著名数学家欧几里得发现了一个 计算完美数的公式:如果2^n-1是一个质数,那么,由公式N(n)=2^(n-1)*(2^n-1)算出的数一定是一个完美数。例如, 当n=2时,2^2-1=3是一个质数,于是N(2)=2^(2-1)*(2^2-1)=2*3=6是一个完美数;当n=3时,2^3-1=7也是一个质数, N(3)=4*7=28是一个完美数;当n=5时,N(5)=496也是一个完美数。 18世纪时,大数学家欧拉又从理论上证明:每一个偶完美数必定是由上述公式算出的。 所以,寻找新的完美数与寻找新的质数密切相关。 也曾经有人验证过位数少于36位的所有自然数,始终也没有发现奇完美数的踪迹。不过,在浩瀚的自然数海洋里,奇 完美数是否存在,也没有任何证明能证实这一结论。 尽管有欧拉和欧几里德的公式,寻找完美数的工作仍然非常艰巨。 例如,当n=31时,N(31) = 2^(31-1)*(2^31-1) = 2305843008139952128,这是一个19位数。 1979年,当人们知道2^44497-1是一个新的质数时,随之也就知道了2^44496*(2^44497-1)是一个新的完美数;1983年 ,人们知道2^86243-1是一个更大的质数时,也就知道了 2^86242*(2^86243-1)是一个更大的完美数。迄今所知最大的 一个完美数是2^43112608*(2^43112609-1)。 出这个题目,是让大家体会分离出一个比较大的整数的因子有多难?判断一个比较大的整数是质数有多难?不信?你按照 前述完美数的定义来写程序,看你能输出到第几个完美数。 现在请你以下列格式输出前8个完美数,每行一个完美数,前面是序号后面是完美数,中间用空格间隔。如: 1 6 2 xx 3 xxx ……
输入格式
无
输出格式
输出前8个完美数,每行一个完美数,前面是序号后面是完美数,中间用空格间隔。
输入样例
无
输出样例
1 6 2 xx 3 xxx …… 8 xxxxxxxx
提示
欧拉证明了,当2^p-1是素数时,2^(p-1)*(2^p-1)是完美数,而且偶完美数都具有这种 形式。目前还没有发现奇完美数。 一般认为存在有无穷多个完美数,但目前知道的2^p-1是素数的p只有47个,他们依次的 p值如下: 2 3 5 7 13 17 19 31 61 89 107 127 521 607 1279 2203 2281 3217 4253 4423 9689 9941 11213 19937 21701 23209 44497 86243 110503132049 216091 756839 859433 1257787 1398269 2976221 3021377 6972593 13466917 20996011 24036583 25964951 30402457 32582657 37156667 42643801 43112609 这题要求输出前8个,用这个序列的前八个当做p,计算2^(p-1)*(2^p-1)即是完美数。 如果此题采用完美数定义(如果一个数的真约数之和等于这个自然数本身,则这个自然数 就称为完美数)来求解的话,产生不了前八个,会计算超时。 还有,此题需要采用64位的整数才可。
我的代码实现
1 #include<iostream> 2 #include"math.h" 3 4 using namespace std; 5 6 bool isPrime(long long n){ 7 int i=2; 8 int q=sqrt(n); 9 for(i=2;i<=q;i++){ 10 if(n%i==0)return false; 11 } 12 return true; 13 } 14 15 16 17 int main(){ 18 int i=1; 19 long long n=2; 20 long long perfect; 21 while(1){ 22 if(isPrime(pow(2,n)-1)){ 23 perfect=pow(2,n-1)*(pow(2,n)-1); 24 cout<<i<<" "<<perfect; 25 cout<<endl; 26 i++; 27 } 28 n++; 29 if(i==9)break; 30 } 31 return 0; 32 }