原题链接:[编程入门]完数的判断
刚开始我是这样写的:
#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。。
虽然好像不是什么好办法,但还是继续做题吧~
0.0分
6 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复