匿名用户
1级
2016-10-12 回答
回答如下:
#include "stdio.h"
int main(void){
int i,j,m;
for(i=4;i<1000;i+=2){
for(m=1,j=2;j*j<=i;j++)
if(!(i%j))
m+=(j!=i/j ? j+i/j : j);
if(m==i){
printf("%3d = 1",i);
for((m>>=1)+=1,j=2;j
if(!(i%j))
printf("+%d",j);
printf("\n");
}
}
return 0;
}
追问:
能不能讲一讲思路
追答:
看注释:
int main(void){
int i,j,m;
for(i=4;i<1000;i+=2){//迄今发现的完数都是偶数,所以只考察1000内的偶数
for(m=1,j=2;j*j<=i;j++)//用2、3、4……去除i,直到i的平方根
if(!(i%j))//若能整除则把由下一句把因子加到m上,m初值=1是因为1肯定是因子
m+=(j!=i/j ? j+i/j : j);//这个判断解决两个因子相等时只加一个,不等加两个
if(m==i){//当因子和m等于i时i就是完数,由以下语句输出因子和的表达式
printf("%3d = 1",i);//先打个当然因子1
for((m>>=1)+=1,j=2;j
if(!(i%j))//若能整除,则j就是它的一个因子
printf("+%d",j);//将这个因子用+号连接输出
printf("\n");
}
}
return 0;
}
追问:
就是说为了在结果里打出他的约数就必须把那次循环写两次对吧。
追答:
没有写两次!头一个循环是考察i是不是完数,第二个循环是对"完数"进行约数分解。如果不是完数,第二循环就不进行,但考察完数的第一个循环必须是穷举的,对范围办的偶数都要考察一遍。