黑马程序员技术交流社区
标题:
找出2000以内的完数
[打印本页]
作者:
ixx__123
时间:
2014-8-19 18:00
标题:
找出2000以内的完数
以前不会的,现在依然不会编写
作者:
xiniuniu
时间:
2014-8-19 19:09
完全数
如果一个数恰好等于它的因子之和,则称该数为“完全数”[1] 。各个小于它的约数(真约数,列出某数的约数,去掉该数本身,剩下的就是它的真约数)的和等于它本身的自然数叫做完全数(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。第三个完全数是496,有约数1、2、4、8、16、31、62、124、248、496,除去其本身496外,其余9个数相加,1+2+4+8+16+31+62+124+248=496。后面的完全数还有8128、33550336等等。
思路: 已知第一个完全数是6,就从6开始循环到2000; 再对6及以后的每个数取约数,用一个变量来存储约数累加之和,一直加到小于此数的所有约数为止。再比较这个约数和是否等于这个数,就可以判断出来了。
作者:
ixx__123
时间:
2014-8-19 19:11
xiniuniu 发表于 2014-8-19 19:09
完全数
如果一个数恰好等于它的因子之和,则称该数为“完全数”[1] 。各个小于它的约数(真约数,列出某数 ...
嗯,看看你的思路,我在想想吧
作者:
xiniuniu
时间:
2014-8-19 19:33
本帖最后由 xiniuniu 于 2014-8-19 19:40 编辑
算法还可以进行优化,减少循环次数, 1+2+3=6
1+2+4+7+14=28
1+2+4+8+16+31+62+124+248=496
发现规律,都加了1, 第一次循环 496 / 2 = 248; 一次得到两个因子2和248; 第二次4、 124; 第三次8、 62, 第四次 16、32
每次两个因子之间大小差越来越小。
示例
1+2+4+7+14=28
int n = 28; // 被除数
int shang = 28; // 商
int sum = 0; // 约数和
for(i = 2; i < shang; i++) // 从2开始
{
if(n % i == 0)
{
shang = n / i; // 减少循环次数
sum = i + shang; // 一次循环计算两个因子和
}
}
if ((sum + 1) == n) // 最后因子和再加上1
{
return n; // 返回完全数
}
以上仅是思路,我没有上机调度,可能还存在细节上的问题
作者:
★Joean_Zhou
时间:
2014-8-19 22:48
希望楼主看得懂。。。多敲敲就会了
//找出2000以内的完数
#include<stdio.h>
int main()
{
//循环遍历2000内所有的数
for (int i = 1; i <= 2000; i++)
{
int sum = 0; //定义变量计算因子的和
//找出该数的因子并相加
for (int j = 1; j < i; j++)
{
//如果为因子就把因子相加
if (i % j == 0)
{
sum += j;
}
}
//如果因子相加的结果等于该数就为完数,输出
if (sum == i)
{
printf("%d ",i);
}
}
return 0;
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2