题目描述
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
(资料图片)
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。
数据范围: 1 \le n \le 5 \times 10^{5} \1≤n≤5×105
输入描述:
输入一个数字n
输出描述:
输出不超过n的完全数的个数
示例1
输入:
1000
输出:
3
思路
思路一:通过完全数的要求根据定义如果一个数恰好等于它的因子之和,则称该数为"完全数",则按要求将一个数的因子加和与其本身对比,如果相同则正确,不同则失败
思路二:通过梅森素数来确定最终结果是不是完全数,如果(2^p-1)是素数,那么它就是梅森素数,再根据用(2^p-1)*2^(p-1),这个就是完全数
具体实现
//写C语言情况下的运算
//根据定义计算
//如果一个数恰好等于它的因子之和,则称该数为"完全数"
#include<iostream>
#include<time.h>
//计算出Rmax以内的所有完全数
#define Rmax 100000
//名字空间初始化
using namespace std;
void main() {
//求解其完全数的因子
for (int i = 3; i <= Rmax; ++i) {
//计算所有因子的和
int sum = 1;
for (int j = 2; j < i; ++j) {
if (i%j == 0) {
//说明j是i的因子
//并对因子求和
sum += j;
}
}
//判断和是否等于数本身
if(sum==i){
cout << i << endl;
}
}
system("pause");
}
//方案二:通过梅森素数来确定最终结果是不是完全数
//如果(2^p-1)是素数,那么它就是梅森素数,
//再根据用(2^p-1)*2^(p-1),这个就是完全数
#include<iostream>
#include<time.h>
#include<math.h>
//定义一个极大的数
#define max 1000000000
using namespace std;
//素数初始化
bool Prime(int prime);
void 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;
system("pause");
}
//求解是否为质数
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;
}
时间复杂度
对于方案一,在遍历的时候采用了两次for循环首先遍历出因子,然后将因子加和,所以时间复杂度为O(n^2),空间复杂度也为O(n)
对于方案二,采用先判断是否为梅森素数,之后采用素数来判断是否为完全数,只遍历了一次,所以时间复杂度为O(n),空间复杂度也为O(n)
小结
在C语言中采用判断是否为完全数的时候,可以先对需要运算的算法计时,通过计时来判断运算的速度,从而确定算法的速度快慢,然后根据题目要求,可以采用直接加和因子的方法用定义求解完全数,也可以利用梅森素数的求解,先求解梅森素数,然后利用梅森素数求完全数的算法来计算最终结果,采用不同的原理可以使算法的时间复杂度降低,加快算法输出速度,也是可以让我们看到更多的方法来针对具体问题,通过不同角度具体分析,具有良好的借鉴意义。
仓储物流“成渝圈”如何乘势而上? 12月3日,连接昆明和万象的中老铁路全线开通运营,被惠及的显...
两件西周青铜簋时隔三千年成功配对 考古工作者介绍,这个铜簋的盖、身分别时隔40余年出土,纹饰...
“医保砍价”不是一个人在战斗 晁星 “我眼泪都快掉下来了”“每一个小群体都不该被放弃”…...
“购物成瘾”真的是一种病 刘艳 牛雅娟 本周日即将迎来“双十二”促销季,很多人又开始摩拳...
因迷恋山间风景,一男子在甘孜州稻城县海拔4000多米的无人区迷失方向,随后与同伴失联。12月的稻城...
嫌疑人DNA信息比中后,成都市公安局刑侦支队技术处DNA实验室民警白小刚一下坐在凳子上,恍惚迟疑间...
一批反映南京大屠杀历史的新书发布 新华社南京12月7日电(记者邱冰清、蒋芳)“以史为鉴,开创未来...
我在现场·照片背后的故事|电影《亲爱的》里面没有的结局,在我眼前“上映” 12月6日,在深圳市...
冥想?泡脚?不如听听助眠音乐 晚上睡不着,白天睡不醒,成为最贴合都市人群的“睡眠画像”。随...
养老话题 老年教育面临缺口 “终身教育”潜力无限 【现实挑战】“新老年”群体愿意在培养兴...
孙海洋被拐14年儿子如何找到的? 警方侦办另一宗拐骗儿童案时发现线索,通过人像比对、DNA确认找...
北京天文馆、圆明园将对未成年人免费开放 12月6日,北京天文馆发布通知称,12月8日起试行对未成...
今年全国粮食总产量再创新高 连续7年保持在1 3万亿斤以上 根据对全国31个省(区、市)的抽样调...
斑块软的很危险 硬的就无碍? 血管里的“垃圾”分类 赶快学起来! 一项最新研究显示:中国...
诺西那生钠注射液大幅降价 聚焦医保谈判背后脊髓性肌萎缩症家庭 医保目录公布那天 好多家长都...
抖音“窗花剪剪”遭抄袭 被判获赔20万元 法院认为“窗花剪剪”的这种表达方式理应受到《著作权...
公安机关近日侦破3起拐卖儿童案件 失散十几年 3组家庭终于团圆了 北京青年报记者12月6日从公...
2021年度十大网络用语发布 本报讯(记者 路艳霞)作为年度“汉语盘点”活动最具网络特色的组成部...
北京天文馆向未成年人免费开放 本报讯(记者 牛伟坤)北京天文馆对票价免费及优惠政策作出调整:1...
2021北京百个网红打卡地发布 本报讯(记者 李洋)2021北京网红打卡地推荐榜单昨晚正式发布。自然...