原题链接:[编程入门]完数的判断
刚开始我是这样写的:
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> int main() { int a,i=1; /*先定义两个变量a和i,i的初值为1(因为一个数的因子包括1)*/ scanf("%d",&a); /*输入想求的数*/ while(i<a) /*循环条件(当i小于a时(不包括等于a,因为一个数的因子不包括本身))*/ { if(a%i==0) /*当i可以被a整除时输出i(这时输出的i即为a的因子)*/ printf("%d its factors are %d\n",a,i); i++; /*变量i的值加1*/ } return 0; } 答案错误????#include <stdio.h> void main() { int a=1,n; scanf("%d",&n); for(int i=1;i<n;i++) { if(n%i==0) a=a*i; } if(a==n) printf("%d",a); else printf("不是"); } 这个完数程序那里错了呢 有大佬给我指教一下吗 谢谢了int main(void) { int x = 0; int y = 0; int a; for (int i = 0; i <= 2; i++) { scanf("%d", &a); printf("%d its factors are ", a); for (int j = 1; j < a; j++) { if (a%j==0) { printf("%d\t", j); } } } return 0; } 我的这个很简单,但是发现编译 不通过 为什么啊