算法之寻找完数(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.完数中的因子可以用”%“方式表达,能够整除的为其中一个因数。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值