欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

相关标签: 笔记 c语言