算法之寻找完数(C语言)

什么是完数?

如果一个数恰好等于它的真因子之和,则称该数为完数。

第一个完全数是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.完数中的因子可以用”%“方式表达,能够整除的为其中一个因数。

猜你喜欢

转载自blog.csdn.net/weixin_56559434/article/details/127218459