解题思路:
参考了很多解法,很多复杂度比较高,提交的话时间会超时,思路都大同小异都是利用循环判断
要么的话就比较难懂,对初学者不是那么友好
下面是我看到的并且认为比较巧妙也比较好懂的一种解法
由题目可以很好理解亲密数的定义,那么我们假设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语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:791 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:889 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:1514 |
C语言训练-求函数值 (C语言代码)浏览:573 |
DNA (C语言代码)浏览:540 |
出圈】指针malloc版浏览:355 |
字符逆序 (C语言代码)浏览:504 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:455 |
C语言程序设计教程(第三版)课后习题1.5 (C++代码)浏览:403 |
逆反的01串 (C语言代码)浏览:1435 |