刚开始我是这样写的:

#include <stdio.h>

int main()
{
    int N;
    scanf("%d", &N);

    int yinzi[N]; //用来存放所查询的数的因子,打印需要
    int sum = 0;  //因子总和
    int n = 0;    //含有因子的个数

    int i, j, k;
    for (i = 2; i < N; i++) //遍历N之内的所有数,从2~N
    {
        for (j = 1; j < i; j++) //用该数除以该数内所有数,若余数为0,则为其因子,不考虑它本身
        {
            if (i % j == 0)
            {
                yinzi[n++] = j;
                sum += j; //对因子求和
            }
        }
        if (sum == i)
        {
            printf("%d its factors are ", i);
            for (k = 0; k < n; k++)
                printf("%d ", yinzi[k]);
            printf("\n");
        }

        sum = 0; //注意清0
        n = 0;
        //memset(yinzi, 0, sizeof(yinzi)); //可以不用这一步,因为n清0了
    }

    return 0;
}


结果超时,可能是循环次数太多了,于是参考其他解决方案,得到下面的代码:

#include <stdio.h>

int main()
{
    int N;
    scanf("%d", &N);

    int yinzi[N]; //用来存放所查询的数的因子,打印需要
    int sum = 0;  //因子总和
    int n = 0;    //含有因子的个数

    int i, j, k;
    for (i = 2; i < N; i++) //遍历N之内的所有数,从2~N
    {
        for (j = 1; j <= i/2; j++) //用该数除以该数内所有数,若余数为0,则为其因子,不考虑它本身
                                         //加快速度1 一个数的因子不可能超过它的1/2
        {
            if (i % j == 0)
            {
                yinzi[n++] = j;
                sum += j; //对因子求和
                if (sum > i)             //加快速度2 当求得sum已经大于该数的时候,提前break
                {
                    sum = 0;
                    n = 0;
                    break;
                }
            }
        }

        if (sum == i)
        {
            printf("%d its factors are ", i);
            for (k = 0; k < n; k++)
                printf("%d ", yinzi[k]);
            printf("\n");
        }

        sum = 0; //注意清0
        n = 0;
    }

    return 0;
}

没想到这样居然通过了,我在codeblocks上面运行的时候有时也会超过1s。。

虽然好像不是什么好办法,但还是继续做题吧~

点赞(14)
 

0.0分

6 人评分

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

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

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

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

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

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

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

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

评论列表 共有 11 条评论

少侠 5年前 回复TA
太感谢了!!!