解题思路:基本都是自定义函数用来判断亲密关系,再在主函数中遍历输出所有亲密数。思路不难,关键就是容易超时,你是循环3000次还是3000*3000次呢?这里如果不追求时间复杂度只追求代码逻辑,很容易犯我第一次犯的错误导致超时!

注意事项:

参考代码:

先给出最容易犯错的自定义函数法示例代码:

#include <stdio.h>

int love(int a,int b)

{

    int sum1=0,sum2=0;

    for(int i=1;i<=a/2;i++)

    {

        if(a%i==0) sum1=sum1+i;

    }

    for(int j=1;j<=b/2;j++)

    {

        if(b%j==0) sum2=sum2+j;

    }

    if (sum1==b&&sum2==a) return 1;

    else return 0;

}//自定义亲密函数对

int main()

{

    int a,b;

    for(a=1;a<=3000;a++)

    {

        for(b=a+1;b<=3000;b++)

        {

            if ((love(a,b)==1))

            {

                printf("(%d,%d)",a,b);

            }

        }

    }

    return 0;

}

那么上面这段代码有任何问题吗?答案是几乎没有,完全能够得出正确结果。可惜太慢了,一定会超时!因为每调用一次love函数都是两次循环,而a和b还要循环嵌套,最后加上判断语句,非常复杂,我尝试过很多回,这段代码无论如何修正都会超时(如果不相信可以copy下来自己试一试),于是沮丧的我翻阅了其他人的代码块,忽然有了思路:亲密函数没必要追求一次性判断两个数并且输出数对,只要求出某个数因子,在主函数循环中将函数结果与循环体的值比较就可以了。这样会减少很多不必要的循环!示例代码如下:

#include<stdio.h>

int sum(int n);

int main(void)

{

    int i;

    int sum1, sum2;

    for(i = 1; i <= 3000; i++)

    {

        sum1 = sum(i);

        sum2 = sum(sum1);

        if(sum2 == i&&i < sum1)//代表因子和数相同,且小的数在数对前面

        printf("(%d,%d)", i, sum1);

    }

     

    return 0;

}

int sum(int n)

{

    int i, sum = 0;

    for(i = 1; i < n; i++)

    if(n % i == 0)

    sum+= i;

    return sum;//不需要判断两数,直接简单求出一个数的因子

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论