
求1到1000内的因子并且是完数,不包括他本身最后一个一个输出
一个实现,如下:
参考链接:
https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E6%95%B0/370913?fromtitle=%E5%AE%8C%E6%BB%A1%E6%95%B0&fromid=6499617
#include <stdio.h>
#include <stdlib.h>
int * findPerfectNumber(int num){
int sum=0;
int n=0; // 存储num真因子个数的变量
// 遍历区间1到(num-1)之间的所有数
for(int i=1;i<num;i++){
if(num%i==0){ // 如果当前的数可以整除num,则将其累加到真因子之和sum中
sum+=i;
n++; // 真因子个数+1
}
}
// printf("sum=%d,n=%d\n",sum,n);
// 申请存储参数num完数信息的内存,n个int用于存储真因子,另外2个int用于存储真因子个数 和 参数num与真因子之和的差值
int * result = (int *)malloc(sizeof(int)*(n+2));
result[0]=num-sum; // 第一个位置存储num与sum的差值,用于判断参数num是否是完数,等于0时为完数
result[1]=n; // 第二个位置存储 完数个数,用于打印完数式子后面部分
// printf("result[0]=%d,result[1]=%d\n",result[0],result[1]);
int j=2; // 存储完数从下标为2的位置开始
for(int i=1;i<num;i++){
if(num%i==0){
result[j]=i; // 将真因子依次存储到剩余位置
// printf("result[%d]=%d\n",j,result[j]);
j++;
}
}
// 返回记录了num完数信息的int指针
return result;
}
int main(void){
for (int i=1;i<=1000;i++){
// 调用函数findPerfectNumber()判断输入的数num 是否为完数
int * result = findPerfectNumber(i);
if (result[0]==0){ // 如果是完数,则按格式打印出此完数的信息
// https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E6%95%B0/370913?fromtitle=%E5%AE%8C%E6%BB%A1%E6%95%B0&fromid=6499617
printf("%d its factors are",i);
// 打印式子的后半部分
// 因为完数信息数组多了个2个位置记录了其他信息,故打印完数从下标2开始,并且结束下标也+2
for(int i=2;i<(result[1]+2);i++){
printf(" %d",result[i]);
}
printf("\n");
}
free(result);
}
return 0;
}
