解题思路:
参考了很多解法,很多复杂度比较高,提交的话时间会超时,思路都大同小异都是利用循环判断
要么的话就比较难懂,对初学者不是那么友好
下面是我看到的并且认为比较巧妙也比较好懂的一种解法
由题目可以很好理解亲密数的定义,那么我们假设A与B为一对亲密数,定义一个数的因数和为法则F
那么就可以得到关系式F(A)=B, F(B)=A
整理上式可以得到变形式:F(F(A))=A, F(F(B))=B,可以利用这个关系式简化程序
参考代码:
#include<stdio.h>
int gcdcount(int n) //定义一个计算因数和的函数,也就是上面说的法则F
{
int count=1; //累计求和,包括1不包括数本身
for(int x=2;x<n;x++) //利用循环判断是否为素数,不是素数则将其因数累加
{
if(n%x==0)
count+=x;
}
return count; //返回值为因数之和
}
int main()
{
for(int i=2;i<3000;i++) //利用循环,寻找亲密数对
{
if(i==gcdcount(gcdcount(i))&&gcdcount(i)>i) //F(F(A))=A,因此只要一个循环和一个变量即可,注意题目要求的输出顺序
{
printf("(%d,%d)",i,gcdcount(i)); //注意输出格式,小数在前,大数在后
}
}
return 0;
}
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复