什么是完数?
如果一个数恰好等于它的真因子之和,则称该数为完数。
第一个完全数是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。
实现目标
寻找10000以内的完数,并且实现用链表存放完数的因子,程序实现整个运行所需时间。
代码实现
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
//定义一个单链表存放完数
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
bool initlist(LinkList &L){
L = (LNode *)malloc(sizeof(LNode));
L -> next = NULL;
return true;
}
void findwanshu(LinkList &L,int num){
for (int i=1;i<=num;i++){
int sum = 0;
for (int j=1;j<=i/2;j++){
if(i%j == 0){
sum = sum + j;
}
}
if (sum == i){
LNode *s = (LNode *)malloc(sizeof(LNode));
s -> data = 0;
s -> next = NULL;
L -> next = s;
for (int k=1;k<=sum/2;k++){
if (sum%k==0){
s -> data = sum;
LNode *p = (LNode *)malloc(sizeof(LNode));
p -> data = k;
p -> next = s -> next;
s -> next = p;
}
}
LNode *find = s->next;
printf("%d的因子是",s->data);
while(find != NULL){
int yinzi = find -> data;
find = find -> next;
printf("%d",yinzi);
if (find != NULL){
printf(",");
}
}
printf("\n\n");
}
}
}
int main(){
clock_t start, end;
start = clock();
LinkList(L);
initlist(L);
findwanshu(L,10000);
end = clock();
double Total_time = (double)(end - start) / CLOCKS_PER_SEC; //单位换算成秒
printf("程序用时 time = %lf s\n",Total_time);
return 0;
}
代码运行效果
总结
1.用单链表存放完数的因子并输出的过程相当于一个链栈。栈的特点是先入后出。所以对于先存放的因子总是后输出。
2.完数中的因子可以用”%“方式表达,能够整除的为其中一个因数。