A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ixx__123 中级黑马   /  2014-8-19 18:00  /  2042 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  以前不会的,现在依然不会编写

4 个回复

倒序浏览
完全数

如果一个数恰好等于它的因子之和,则称该数为“完全数”[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及以后的每个数取约数,用一个变量来存储约数累加之和,一直加到小于此数的所有约数为止。再比较这个约数和是否等于这个数,就可以判断出来了。
回复 使用道具 举报
xiniuniu 发表于 2014-8-19 19:09
完全数

如果一个数恰好等于它的因子之和,则称该数为“完全数”[1] 。各个小于它的约数(真约数,列出某数 ...

  嗯,看看你的思路,我在想想吧
回复 使用道具 举报
本帖最后由 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; // 返回完全数
}




以上仅是思路,我没有上机调度,可能还存在细节上的问题
回复 使用道具 举报
希望楼主看得懂。。。多敲敲就会了
  1. //找出2000以内的完数

  2. #include<stdio.h>

  3. int main()
  4. {
  5.    
  6.    
  7.     //循环遍历2000内所有的数
  8.     for (int i = 1; i <= 2000; i++)
  9.     {
  10.         int sum = 0;  //定义变量计算因子的和
  11.         
  12.         //找出该数的因子并相加
  13.         for (int j = 1; j < i; j++)
  14.         {
  15.             //如果为因子就把因子相加
  16.             if (i % j == 0)
  17.             {
  18.                 sum += j;
  19.             }
  20.         }
  21.         //如果因子相加的结果等于该数就为完数,输出
  22.         if (sum == i)
  23.         {
  24.             printf("%d ",i);
  25.         }
  26.     }
  27.    
  28.     return 0;
  29. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马