首页 > 试题广场 >

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,

[问答题]
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为12,3,而6=1+2+3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子:

6 its factors are 1,2,3




推荐

1.

#define M 1000                           /*定义寻找范围*/

#include<stdio.h>

int main()

{

int k1,k2,k3,k4,k5,k6,k7,k8,k9,k10;

int i,a,n,s;

for(a=2;a<=M;a++)                /*a是2-1000之间的整数,检查它是否完数*/

{n=0;                             /*n用来累计a的因子的个数*/

s=a;                       /*s用来存放尚未求出的因子之和,开始时等于a*/

for(i=1;i<a;i++)                 /*检查i是否a的因子*/

if(a%i==0)                      /*如果i是a的因子*/

{n++;                          /*n加1,表示新找到一个因子*/

s=s-i;                    /*s减去已找到的因子,s的新值是尚未求出的因子之和*/

switch(n)                        /*将找到的因子赋给k1...k9,或k10*/

{case 1:

k1=i;break;            /*找出的第1个因子赋给k1*/

case 2:

k2=i;break;         /*找出的第2个因子赋给k2*/

case 3:

k3=i;break;              /*找出的第3个因子赋给k3*/

case 4:

k4=i;break;              /*找出的第4个因子赋给k4*/

case 5:

k5=i;break;              /*找出的第5个因子赋给k5*/

case 6:

k6=i;break;                /*找出的第6个因子赋给k6*/

case7:

k7=i;break;               /*找出的第7个因子赋给k7*/

case 8:

k8=i;break;                /*找出的第8个因子赋给k8*/

case 9:

k9=i;break;                /*找出的第9个因子赋给k9*/

case 10:

k10=i;break;                /*找出的第10个因子赋给k10*/

}

}

if (s==0)

{

printf("%d ,Its factors are ",a);

if(n>1) printf("%d,%d",k1,k2);             /*n>1表示a至少有2个因子*/

if(n>2) printf(",%d",k3);              /*n>2表示至少有3个因子,故应再输出一个

因子*/

if(n>3) printf(",%d,k4);               /*n>3表示至少有4个因子,故应再输出一个

因子*/

if(n>4) printf(",%d",k5);                  /*以下类似*/

if(n>5) printf(",%d",k6);

if(n>6) printf(",%d",k7);

if(n>7) printf(",%d",k8);

if(n>8) printf(",%d,k9);

if(n>9) printf(",%d,k10);

printf("\n'");

}

}

return 0;

}

2.

#include<stdio.h>

int main( )

{int m,s,i;

for(m=2;m<1000;m++)

{s=0;

for(i=1;i<m;i++)

if((m%i)==0)s=s+i;

if(s==m)

{printf("%d,its factors are",m);

for(i=1:i<m;i++)

if(m%i==0)  printf("%d",i);

printf("\n”);

}

}

return 0;

}


编辑于 2018-03-25 10:57:03 回复(0)
#include<stdio.h> 
int main(){
	int i,n=1000,s=0;
	for(i=2;i<=n;i++){					//从2到1000,找完数 
	 	s=0;
	 	for(int j=1;j<=i/2;j++){		//找i的所有因数 
	 		if(i%j==0)
	 			s+=j;					//对所有因数进行求和 
		}
		if(s==i){						//若为完数 
		 	printf("%d its factors are ",i);
		 	printf("1");				//输出因数1 
		 	for(int j=2;j<=i/2;j++)		//找i的所有大于1的因数 
	 			if(i%j==0)
	 				printf(",%d",j);	//输出大于1的所有因数 
	 		printf("\n");
	 	}
	}
	return 0;
}


编辑于 2021-01-16 14:19:37 回复(1)
#include <stdio.h>
int main() {
    int i,j;
    int sum ;
    for(i = 2;i<=1000;i++){
        sum = 0;
        for(j = 1;j < i;j++){
            if(i%j==0){
                sum = sum + j;
            }
        }
        if(i==sum){
            printf("%3d its factors are",i);
            for(j = 1;j < i;j++){
                if(i % j == 0){
                    printf("%5d",j);
                }
            }
            printf("\n");
        }
    }
    return 0;
}

发表于 2022-09-23 16:32:29 回复(0)
#include <stdio.h>
#include <stdlib.h>
int isPrime(int n){//判断是不是素数,如果是,那肯定不是完数
 for(int i = 2; i < n;i ++){
  if(n % i == 0)
   return 0;
 }
 return 1;
}
int isAllNumber(int n){//判断是否是完数
 if(isPrime(n) == 1){
  return 0;
 }
 else{
  const int s = 10 * n;
  int store[s];//用来储存完数的所有因子
  for(int i = 0; i < s; i ++){//数组初始化
   store[i] = 0;
  }
  int t = 0;//记录因子个数
  for(int i = 1; i < n; i ++){//开始储存因子
   if(n % i == 0){
    store[t] = i;
    t ++;
   }
  }
  int cnt = 0;//记录各因子之和
  for(int i = 0; i < t; i ++){
   cnt += store[i];
  }
  if(cnt == n)//判断是否为完数
   return 1;
  else
   return 0;
 }
}
int main(){
 int store[1000];//该数组用来储存完数
 for(int i = 0; i < 1000; i ++){//数组初始化
  store[i] = 0;
 }
 int t = 0;//记录完数个数
 for(int i = 1; i <= 1000; i ++){//把所有完数先储存下来
  if(isAllNumber(i) == 1){
   store[t] = i;
   t ++;
  }
 }
 int cnt[1000];//该数组用于记录每个完数的因子个数
 for(int i = 0; i < 1000; i ++){//数组初始化
  cnt[i] = 0;
 }
 for(int i = 0; i < t; i ++){//第一重循环层次是不同的‘完数’
  for(int j = 1; j < store[i]; j ++)//第二重开始找不同完数
   if(store[i] % j == 0){//的因子个数 
    cnt[i] ++;//记录下每个完数对应的因子个数
  }
 }
 const int k = t;
 int* store2[k];//该指针数组用于存储不同完数的不同因子
 /*指针数组成员是一个个指针,每个指针又是可变的数组*/
 for(int i = 0; i < t; i ++){//层次是不同完数
  int f = 0;//代表每个指针的元素位置
  store2[i] = malloc(sizeof(int) * cnt[i]);//动态分配指针内存,
  //大小就是各个完数的因子个数
  for(int j = 1; j < store[i]; j ++){
   if(store[i] % j == 0){//再判断因子
    * (store2[i] + f) = j;//将因子存在对应完数(一个指针)下的不同元素位置(+ f)
    f ++;
   }
  }
  * (store2[i] + cnt[i]) = 0;//最后一个因子的后面一个位置设零
 }
 store2[t] = 0;//最后一个指针后面一个指针设零
 for(int i = 0; i < t; i ++){//层次为“完数”
  printf("%d its factors are ", store[i]);
  for(int j = 0; j < cnt[i] - 1;j ++){//开始打各完数(各指针)下的因子(j即为元素)
   printf("%d,", *(store2[i] + j));//打到倒数第二个
  }
  printf("%d\n",*(store2[i] + cnt[i] - 1));//倒数第一个后面没有逗号,直接换行
 }
 free(store2);//记得释放空间
}
发表于 2019-12-22 20:19:33 回复(0)