输出1000以内所有的完数,并输出其所有的因子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
问题:输出1000以内所有的完数,并输出其所有的因子。完数的定义如下:一个数的所有因子(除其自身)之和恰好等于其自身。
分析:问题的关键为求解一个数的所有因子,并求其和。假设当前的数m,计算其因子的过程,为遍历从1到 m-1所有的数,并判定是否可以整除m。
数据要求
问题中的常量:
#define N 1000 /*完数求解范围*/
问题的输入:
无
问题的输出:
int i /*当前完数*/
int j /*当前完数的因子*/
初始算法
1.因子和初始化为0
2.遍历当前整数的因子并计算因子和
3.判断是否完数
4.输出完数及其因子
算法细化
步骤2遍历当前整数的因子并计算因子和的细化:
计算整数m所有因子之和的过程如下:
sum=0;
for(j=1;j { if(m%j==0) /*j为m 的因子*/ sum=sum+j; } 又根据一个数除本身以外的所有因数都小于或等于这个数的一半,可以对上述循环进一步处理,减少循环次数。 sum=0; for(j=1;j<=m/2;j++) { if(m%j==0) /*j为m 的因子*/ sum=sum+j; } 流程图 程序代码如下: #include "stdio.h" #include "math.h" #define N 1000 /*完数求解范围*/ void main() { unsigned int i,j,sum; for(i=1;i { sum=0; for(j=1;j<=i/2;j++) { if(i%j==0) sum=sum+j; } if(sum==i) { printf("\n%5d\n",i); for(j=1;j<=i/2;j++) { if(i%j==0) printf("%5d",j); } } } } 程序运行结果如下: 6 1 2 3 28 1 2 4 7 14 496 1 2 4 8 16 31 62 124 248