刚开始我是这样写的:
#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分
10 人评分
#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("不是"); } 这个完数程序那里错了呢 有大佬给我指教一下吗 谢谢了
ABU 2019-12-28 12:53:03 |
a=a*i是干嘛?
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; } 我的这个很简单,但是发现编译 不通过 为什么啊
先不说其他的 int yinzi[N]; 这个为什么可以通过
yinzi[n++] = j; sum += j; //这里换成了sum+=yinzi[n]之后运行结果就出问题了 请问sum+=yinzi[n]的表达方式有什么问题吗?