1. (10 分)输出 10000000000 以内的完数,所谓完数即一个数
恰好等于它的因子(除去自身)之和,例如:6 = 1 + 2 + 3,将结
恰好等于它的因子(除去自身)之和,例如:6 = 1 + 2 + 3,将结
果输出至 out1.txt 中。
/*10000000000 的实现只用long long不行,要用到
完数的性质:
大数学家欧拉曾推算出完全数的获得公式:如果p是质数,且2^p-1也是质数,那么(2^p-1)X2^(p-1)便是一个完全数。
例如p=2,是一个质数,2^p-1=3也是质数,(2^p-1)X2^(p-1)=3X2=6,是完全数。
例如p=3,是一个质数,2^p-1=7也是质数,(2^p-1)X2^(p-1)=7X4=28,是完全数。
例如p=5,是一个质数,2^p-1=31也是质数,(2^p-1)X2^(p-1)=31X16=496是完全数。*/
#include<iostream>
#include<fstream>//输入输出文件流
#include<cmath>//sqrt()和pow(,)需要
#define N 10000000000
using namespace std;
int zhishu(int n)
{
int i;
for(i=2;i<=sqrt(n);i++)
{
if (n%i==0)
{
return 0;
}
}
if(i>sqrt(n))
{
return 1;
}
}//判断是质数
int main()
{
int i;
long long n;
fstream file("out1.txt",ios::out);
for(i=2;;i++)
{
if(zhishu(i)&&zhishu(pow(2,i)-1))
{
n=pow(2,i-1)*(pow(2,i)-1);
if(n>N)
{
return 0;
}
//cout<<n<<endl;
file<<n<<endl;
}
}
return 0;
}
要是要把完数的判断条件也写在另一个函数中
#include<iostream>
#include<fstream>//输入输出文件流
#include<cmath>//sqrt()和pow(,)需要
#include<cstdlib>//exit(0);需要
#define N 10000000000
using namespace std;
int zhishu(long long n)
{
long long i;
for(i=2;i<=sqrt(n);i++)
{
if (n%i==0)
{
return 0;
}
}
if(i>sqrt(n))
{
return 1;
}
}//判断是质数
long long wanshu(int p)
{
long long n=pow(2,p-1)*(pow(2,p)-1);
if(n>N)
{
//return 0;
exit(0);
}
return n;
}//完数性质
int main()
{
int i;
long long n;
fstream file("out1.txt",ios::out);
for(i=2;;i++)
{
if(zhishu(i)&&zhishu(pow(2,i)-1))
{
n=wanshu(i);
/*if(n==0)//因为上面完数部分有n>N的情况
{
return 0;
}
else
{*/
//cout<<n<<endl;
file<<n<<endl;
//}
}
}
return 0;
}