Perfect Number[完数]

本文介绍了一种寻找完全数的方法,通过检测梅森素数来确定完全数。使用了快速的素数检测算法,并提供了完整的C++实现代码。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。

#include<iostream>
#include<time.h>
#include<math.h>
#define max 1e9
using namespace std;
//梅森素数
//原理:如果(2^p-1)是素数,那么它就是梅森素数,再根据用(2^p-1) * 2^(p-1),这个就是完全数。
bool Prime(int prime);
int main() {
	clock_t start, end;
	start = clock();
	
	for (int p = 2;  ; ++p) {
		int perfect = (pow(2 , p) - 1) * pow(2 , p - 1);
		if (perfect > max) break;
		int prime = pow(2 , p) - 1;
		if (Prime(prime))  cout << perfect << endl;
	}
	//计算开始到找完后的时间 
	end = clock();
	float time = (float)(end - start) / 1000;
	cout << "time is" << time << "s" << endl;
	return 0; 
}
 
bool Prime(int prime) {
	bool choice = true;//假设为质数
	int k = sqrt((float)prime);
	for (int j = 2; j <= k; ++j) {
		if (prime % j == 0) {//不是质数
			choice = false;
			break;
		}
	}
	return choice;
}

/*完全数

6

28

496

8128

33550336

------------------------------------------------------------------------------------------------------------------------------------

6

28

496

8128

33550336

time is0.006s

//判断素数
/*
1.如果数不是很大,且追求速度快,接近O(n)可用埃式筛法sieve,
但需要开辟数组空间is_prime[maxx]来记录是否为素数。
然后直接判断is_prime[index]
2.普通判断方法:
bool Prime(int prime) {
	bool choice = true;//假设为质数
	int k = sqrt((float)prime);
	for (int j = 2; j <= k; ++j) {
		if (prime % j == 0) {//不是质数
			choice = false;
			break;
		}
	}
	return choice;
}
*/

 

6-2 使用函数输出指定范围内的完数 分数 15 全屏浏览 切换布局 作者 陈建海 单位 浙江大学 本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数和()之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。 函数接口定义:  1 int factorsum( int number ) ; 2 void PrintPN( int m, int n ); 放大 全屏 复制 其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[m, n]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。 裁判测试程序样例:  1 #include <stdio.h> 2 3 int factorsum( int number ) ; 4 void PrintPN( int m, int n ) ; 5 6 int main() 7 { 8 int m, n; 9 10 scanf("%d %d" , &m, &n); 11 if ( factorsum(m) == m ) printf("%d is a perfect number\n" , m); 12 if ( factorsum(n) == n ) printf("%d is a perfect number\n" , n); 13 PrintPN(m, n); 14 15 return 0 ; 16 } 17 18 /* 你的代码将被嵌在这里 */ 收起 放大 全屏 复制 输入样例1: 6 30 放大 全屏 复制 输出样例1: 6 is a perfect number 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 放大 全屏 复制 输入样例2: 7 25 放大 全屏 复制 输出样例2: No perfect number
最新发布
11-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值