20201213c亲密数
程序员文章站
2022-07-10 17:36:34
...
如题:两个不同的自然数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
一开始我看错题了,以为亲密数是两个因数之和相等的数,于是我们学校的oj就理所当然的显示“输出超出限制”,于是改了一下。不出所料超时了,我一开始写了三个for循环(一个在用来计算因数和的函数里,两个在把数字一一列举做对比)。
于是打算减少一个循环或者把循环改简单
改的第一版
#include <stdio.h>
int main()
{
int a, b, i, n;
for (a = 1; a <= 3000; a++)
{
for (b = 0, i = 1; i <= a / 2; i++ )
{
if(! (a % i))
{
b += i;
}
}
for (n = 0, i = 1; i <= b/2; i++)
{
if(! (b % i))
{
n += i;
}
}
if(n == a && a < b)
{
printf("(%d,%d)",a,b);
}
}
return 0;
}
这次的思路是先一一列出各个数的因数和,根据题意这个数如是亲密数那么它的因数和是有对应数相等的,于是用该数的因数和作为一个数去求他的因数和,如果这个因数和等于原来的那个数,那么他们是一组亲密数。
然后,我发现了一个更快的方法,因为求因数和的步骤重复了,索性用个函数代替,于是有了下面一版。
#include<stdio.h>
int qms(int x)
{
int sum=0;
for(int y=1;y<=x/2;y++)
{
if(x%y==0){sum=sum+y;}
}
return sum;
}
int main()
{
for(int x=1;x<=3000;x++)
{
if(x==qms(qms(x))&&x>qms(x)){printf("(%d,%d)",x,qms(x));}
}
return 0;
}
这个真的是秒出答案,直接判断该数是不是等于因数和的因数和就行了,于是这个代码既简短又快。如果还有别的办法请务必告诉我555
下一篇: 20201213周回顾