解题思路:
参考了很多解法,很多复杂度比较高,提交的话时间会超时,思路都大同小异都是利用循环判断
要么的话就比较难懂,对初学者不是那么友好
下面是我看到的并且认为比较巧妙也比较好懂的一种解法
由题目可以很好理解亲密数的定义,那么我们假设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语言代码)浏览:2474 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:881 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:749 |
IP判断 (C语言代码)浏览:585 |
找出最长的字符串来 (C语言代码)浏览:1822 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:652 |
C语言训练-字符串正反连接 (C语言代码)浏览:651 |
逆反的01串 (C语言代码)浏览:1517 |
C二级辅导-阶乘数列 (C语言代码)浏览:669 |
A+B for Input-Output Practice (I) (C语言代码)浏览:595 |