完数2

#include <stdio.h>
#include <stdlib.h>
#define N 1000
#define P 900000

int prime(int*);  // 求質數表

int factor(int*, int, int*);  // 求factor

int fsum(int*, int);  // sum ot proper factor
int main(void)
{    
 int ptable[N+1] = {0};         // 儲存質數表    
  int fact[N+1] = {0};           // 儲存因式分解結果    

     int count1, count2, i;    
     count1 = prime(ptable);    
     for(i = 0; i <= P; i++)
  {        
   count2 = factor(ptable, i, fact);        
   if(i == fsum(fact, count2))
   {
    printf("Perfect Number: %d/n", i);    
   }
  }        
  printf("/n");    
  return 0;
 }
int prime(int* pNum)
{    
  int i, j;    
  int prime[N+1] = {0, 0, 1};    
  for(i = 3; i <= N; i+=2)        
   prime[i] = 1;    
  for(i = 3; i*i <= N; i += 2)
  {        
   if(prime[i] == 1)
   {            
    for(j = i*i; j <= N; j += 2 * i)
    {                
     prime[j] = 0;            
    }        
   }    
 }    
  for(i = 2, j = 0; i < N; i++)
  {        
   if(prime[i] == 1)            
   pNum[j++] = i;    
  }    
  return j;
}

int factor(int* table, int num, int* frecord)
{    
  int i, k;    
  for(i = 0, k = 0; table[i] * table[i] <= num;)
  {        
   if(num % table[i] == 0)
   {            
    frecord[k] = table[i];            
    k++;            
    num /= table[i];        
   }        
   else
   {            
    ++i;    
   }
  }    
  frecord[k] = num;    
  return k+1;
}

int fsum(int* farr, int c)
{    
   int i, r, s, q;    
   i = 0;   
   r = 1;    
   s = 1;    
   q = 1;    
   while(i < c)
   {        
    do
    {            
     r *= farr[i];            
     q += r;            
     i++;        
    } while(i < c-1 && farr[i-1] == farr[i]);
          
     s *= q;        
     r = 1;       
      q = 1;    
    }    
    return s / 2;
}
 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值