解题思路:
使用两层循环,外循环寻找完数,内循环寻找因子
细节上为了避免输出因子时仍要循环寻找因子,引入数组来储存因子,并用指针的移动来控制数组的读写
但是非完数也会有储存因子的过程,所以代码写得少了,但运行速度并不算快
主要是不希望做重复的过程和定义太多变量,容易搞乱
参考代码:
#include <stdio.h> int main() { int n; scanf("%d", &n); //输入n for (int i = 6; i <= n; i++) //for循环从第一个完数6开始 { // if (i % 10 != 6 && i % 10 != 8) continue; //减少运行时间可加入此行,跳过个位非6与8的数 int s[100] = {0}; //初始化数组s全为0,循环内的临时数组每次循环都会初始化 int *p = s; //通过指针p的移动来控制数组的读写 for (int j = 1; j <= i / 2; j++) { if (i % j == 0) { *++p = j; //此处p先后移,再赋值储存因子j s[0] += j; //s[0]储存因子的和 } } if (s[0] == i) //s[0]==i 则 i 为完数 { printf("%d its factors are", i); for (p = &s[1]; *p != 0; p++) //for循环p指向s[1],值为0时停止,每次循环后移一次 { printf(" %d", *p); } putchar('\n'); } } return 0; }
0.0分
34 人评分
//一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 //例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 //编程序找出N之内的所有完数,并按下面格式输出其因子 //6 its factors are 1 2 3 //28 its factors are 1 2 4 7 14 //496 its factors are 1 2 4 8 16 31 62 124 248 #include<stdio.h> int main() { int a,b[100],n,i,j,k,sum=0,count=0; scanf("%d",&n); for(a=1;a<n;a++) { for(i=1;i<a;i++) { if(a%i==0) { b[count]=i; count++; sum=sum+i; } if(sum==a) { printf("%d its factors are ",a); for(j=0;j<count;j++) printf("%d ",b[j]); printf("\n"); } } } return 0; }
C语言程序设计教程(第三版)课后习题9.8 (Java代码)浏览:1674 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:702 |
兰顿蚂蚁 (C++代码)浏览:1160 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:388 |
A+B for Input-Output Practice (V) (C语言代码)浏览:497 |
数组与指针的问题浏览:760 |
C语言程序设计教程(第三版)课后习题9.8 (C语言代码)浏览:672 |
GC的苦恼 (C语言代码)浏览:672 |
震宇大神的杀毒软件 (C语言代码)浏览:1162 |
判定字符位置 (C语言代码)浏览:849 |
像光 2021-01-27 11:43:42 |
运行错误,很懵
CodeRookie 2021-01-27 15:11:09 |
要在外循环里先重置sum=0, count=0,不然后面的数据会接着前面失败的,还有,最好把 if(sum==a) 这一段放在外循环里,而不是内循环
像光 2021-01-27 17:04:39 |
@Shmily124 哦哦,原来这样,谢谢大哥了