#include"stdio.h"intmain(){//编程求完数//完数就是一个数恰好等于它的因子之和 例如:6=1+2+3//一个数的因子的个数是有限的.最小的因子是1,最大的因子是它本身.int i, j,sum=0;//sum的值要初始化一下,因为在内层循环的第一次用的时候没有初始化,编译器会报错for(i =1; i <=1000; i++){
sum =0;//这个sum的初始化值很重要,因为sum是累加功能,每次循环后都会有值,所以要初始化一下//sum初始化这个地方最容易出错for(j =1; j <= i /2; j++)//i除以2的原因是:比如6,6的因子除了本身之外不可能大于他的一半{//另外除以2也是相当于除去它本身,比如:6=1+2+3中就没有6if(i%j ==0){
sum = sum + j;//j从1开始,也就是+1的原因是每个数都至少有一个因子1}}if(sum == i)//判断{printf("%d的因子:", i);//输出它的因子for(j =1; j <= i /2; j++){if(i%j ==0){printf("%d ", j);}}printf("\n");}}return0;}
用数组求完数
#include"stdio.h"intmain(){int i, j;int arr[50]={0};//50个数字肯定够存前1000个数的因子,因为1到50的和大于1000for(i =1; i <=1000; i++){int k =0;//每次循环都要初始化为0int sum =0;//每次循环都要初始化为0for(j =1; j <= i/2; j++){if(i%j ==0){
arr[k]= j;//将找到的因子存放在数组中
k++;}}for(j =0; j < k; j++)//数组的下标从0开始,所以不能写<={
sum = arr[j]+ sum;}if(sum == i){printf("完数%d的因子:", i);for(j =0; j < k; j++){printf("%d ", arr[j]);}printf("\n");}}return0;}