分享

完数—C语言实现

 幸福的落叶@ing 2010-09-24

 

 

题目:一个数如果恰好等于它的所有因子之和,这个数就称为"完数"。例如1+2+4+7+14=28.编程
       找出1000以内的所有完数。

#include "Stdio.h"
#include "Conio.h"

int main(void)
{
 /* 此处添加你自己的代码 */
    int i,n,sum ;
    printf("\nFind a num like 28 == 1 + 2 + 4 + 7 + 14 in  0~1000 ");
    printf("\nThe all num is :");
    for( n = 1; n < 1000; n++)
    {
        sum = 0;
        for(i = 1;i < n; i++)
            if(n%i == 0)
                sum += i;
        if(sum == n)
              printf("%4d",n);
         }

  getch();
  return 0;
}

--------- 完数(Prefect  number的形式------------------------------

欧几里德证明了:一个偶数是完数,当且仅当它具有如下形式:2^(p-1)*(2^p-1)   
  其中2^p-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,8128。   
   
  古希腊数学家欧几里德是通过   2^(n-1)*(2^n-1)   的表达式发现头四个完全数的。   
   
  当   n   =   2^1*(2^2-1)   =   6   
  当   n   =   2^2*(2^3-1)   =   28   
  当   n   =   2^4*(2^5-1)   =   496   
  当   n   =   2^6*(2^7-1)   =   8128   
  欧几里德证明了:一个偶数是完数,当且仅当它具有如下形式:2^(n-1)*(2^n   -1)。   
   
   
  尽管没有发现奇完数,但是当代数学家奥斯丁·欧尔(Oystein   Ore)证明,若有奇完全   
  数,则其形状必然是12p   +   1或36p   +   9的形式,其中p是素数。在1018以下的自然数中奇完   
  数是不存在的。   
   
  3   
  例子   
  6,28、496,8128,33550336,8589869056(10位),137438691328(12位),   
  2305843008139952128(19位)……   
   
   
  偶完数都是以6或8结尾。如果以8结尾,那么就肯定是以28结尾。   
  除6以外的偶完数,把它的各位数字相加,直到变成一位数,那么这个一位数一定是1(亦即   
  :除6以外的完数,被9除都余1。):   
  28:2+8=10,1+0=1   
  496:4+9+6=19,1+9=10,1+0=1   
   
  所有的偶完数都可以表达为2的一些连续正整数次幂之和,从2p   -   1到22p   -   2:   <注:以下a的n次方表示形式为a(n)>
  6=2(1 ) +   2(2 )
  28=2(2  ) +   2(3)   +   2(4)   
  8128=2(6)   +   2(7)   +   ...   +   2(12)   
  33550336=2(12)   +   2(13 )  +   ...   +   2(24)   
   
  每一个偶完数都可以写成连续自然数之和:   
  6=1+2+3   
  28=1+2+3+4+5+6+7;   
  496=1+2+3+…+30+31   
   8128 = 1+2+3+...+126+127 
  除6以外的偶完数,还可以表示成连续奇数的立方和(被加的项共有):   
  28=1(3)   +   3(3)   
  496=1(3)   +   3(3)   +   5(3)   +   7(3)   
  8128=1(3 )  +   3(3)   +   5(3)   +   ...   +   15(3)   
  33550336=1(3)   +   3(3)   +   5(3)   +   ...   +   125(3)   +   127(3)  
   
  每一个完数的所有约数(包括本身)的倒数之和,都等于2:   
  1/1   +   1/2   +   1/3   +   1/6   =2   
  1/1   +   1/2   +   1/4   +   1/7   +   1/14   +   1/28   =2   
  它们的二进制表达式也很有趣:   
  (6)10   =   (110)2   
  (28)10   =   (11100)2   
 (8128)10 = (1111111000000)2

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多