第九届“蓝桥杯”校内选拔赛试题

1. (10 分)输出 10000000000 以内的完数,所谓完数即一个数
恰好等于它的因子(除去自身)之和,例如: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值