游客 Signup | Login
中文 | En

2876 - 【验证性】第7章:函数 完美数

编程计算并输出0~10000之间所有的完美数,要求在主函数中调用函数来完成。

说明:如果有一数n,其真因数(Proper factor)的总和等于n,则称之为完美数(Perfect Number), 例如以下几个数都是完美数: 6 = 1 + 2 + 3  28 = 1 + 2 + 4 + 7 + 14  496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248   

程式基本上不难,第一眼看到时会想到求出所有真因数,再进一步求因数和,不过若n值很大,则此法会花费许多时间在回圈测试上,十分没有效率,例如求小于10000的所有完美数。

Input

Output

输出有多行。一行一个数。

Examples

Input


                

Output


                

Solution C

#include <stdio.h>  
#include <stdlib.h>    
#define N 1000  
#define P 10000    
int prime(int*);  // 求质数表   
int factor(int*, int, int*);  // 求factor (因子)  
int fsum(int*, int);  // sum ot proper factor    
int main() 
{  
    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("%d\n", i);      
	}            
	printf("\n");        
	return 0;  
}    
int prime(int* pNum) 
{      
    int i, j;       
	int prime[N+1];        
	for(i = 2; i <= N; i++)          
	    prime[i] = 1;        
	for(i = 2; i*i <= N; i++) 
	{     
	    if(prime[i] == 1) 
        {        
		    for(j = 2*i; j <= N; j++) 
			{                 
			    if(j % i == 0)                      
				     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;  
}
Time Limit 1 second
Memory Limit 2 MB
Discuss Stats
上一题 下一题