码迷,mamicode.com
首页 > 其他好文 > 详细

完全数PerfectNumber

时间:2015-04-28 02:01:45      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:完全数   完美数   perfectnumber   

<span style="font-size:24px;color:#ff0000;">/*
	完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
	它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
	例如,第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。
	第二个完全数是28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
	编程求10000以内的完全数。
*/
#include<stdio.h>
#define RANGE 10000         //查找的最大范围
#define STRLENTH 100        //存放真因子的数组的范围
bool Is_perfect_num(int n)
{
	int array[STRLENTH];//存放真因子的数组
	int count = 0;      //真因子的个数
	int total = 0;      //真因子相加的和

/*将真因子存放于数组中*/
	for(int i=1;i<n;++i)
	{
		if(n%i == 0)
		{
			array[count++] = i;
	//		count++;
		}
	}
/*计算所有真因子的和*/
	for(i=0;i<count;++i)
	{
		total += array[i];
	}
//	if(total == n)
//		return true;//如果是完全数,返回ture否则返回false
//	else 
//		return false;
	return (total == n);

}

int main()
{
	for(int i=1;i<=RANGE;++i)
	{
		if(Is_perfect_num(i))
			printf("%d\n",i);
	}
	return 0;
}
</span>

技术分享


上述代码,效率不高(求约数时,挨个判断1 --> n-1),且浪费存储空间(用到数组)

改进版代码如下:


/*
	6: (1,6)      (2,3)---->开始重复--->(3,2)
	12:(1,12)(2,6)(3,4)---->开始重复--->(4,3)(6,2)
	即:
	n=a*b(a<=b)  36=6*6---->a,b是n的真因子------>>>>当b>a时开始重复
*/
#include<stdio.h>
#define RANGE 10000     //查找的最大范围
bool Is_perfect_num(int n)
{
	int total = 0;  //因子(约数)相加的和
	int a = 1;      //第一对因子(约数)
	int b = n;
	
	while(a < b)    //未重复
	{
		if(n%a == 0)
		{
			total += a+b;//a,b是n的因子,加入到total中
		}
		a++;//为下一次判断做准备
		b = n/a;
	}

/*a,b相等的情况,只加一次,所以不能放入上面的while循环中,得单独考虑*/
	if(a == b && a*b == n)
	{
		total += a;
	}
/*注意已下return语句,比用if else简洁多了,本身就是个布尔类型*/
	return (total-n == n);//求所有真因子的和,所以将本身减去
}

int main()
{
	for(int i=1;i<=RANGE;++i)
	{
		if(Is_perfect_num(i))
			printf("%d\n",i);
	}
	return 0;
}


完全数PerfectNumber

标签:完全数   完美数   perfectnumber   

原文地址:http://blog.csdn.net/zongyinhu/article/details/45320749

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!