C 练习实例19
题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
程序分析:请参照:C 练习实例14。
实例
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
#include<stdio.h>
#define N 1000
int main()
{
int i,j,k,n,sum;
int a[256];
for(i=2;i<=N;i++)
{
sum=a[0]=1;
k=0;
for(j=2;j<=(i/2);j++)
{
if(i%j==0)
{
sum+=j;
a[++k]=j;
}
}
if(i==sum)
{
printf("%d=%d",i,a[0]);
for(n=1;n<=k;n++)
printf("+%d",a[n]);
printf("\n");
}
}
return 0;
}
以上实例输出结果为:
6=1+2+3 28=1+2+4+7+14 496=1+2+4+8+16+31+62+124+248
Andy
and***ayne@foxmail.com
参考代码:
Andy
and***ayne@foxmail.com
HIT_CCC
117***2963@qq.com
参考方法:
HIT_CCC
117***2963@qq.com
win
l.z***16@qq.com
参考答案中的迭代次数利用了以下结论:假设有一个正整数N,对于 N/2 < a < N,a 不可能是 n 的因子。因为可以推导出 1<N/a<2,所以迭代范围缩小为 i<=N/2。
可以对以上情形进行推广,假设有一个正整数N,N 的所有因子为 a0 a1 ... an,且 a0<a1<...<an,则有以下结论:若 a1 为 N 的因子,则 N/a1 也是 n 的因子,且 N=a0*an=a1*an-1=...。对于 an-1<i<an,i 不可能是 N 的因子;因为可以推导出 a0=N/an<N/i<N/an-1=a1,a0 和 a1 范围内不存在N的因子。所以在确定了 a 是 N 的因子之后,则可以确定 N 的另一个因子 N/a,且迭代范围可以缩小为i<N/a。
win
l.z***16@qq.com