第1个回答 2018-01-05
// 本程序演示一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数
#include"stdio.h"
main()
{
int i,j,s,sum;
printf("完数:\n") ;
sum=0;
for(i=2;i<=1000;i++)
{ s=0; ;//此处s=0一定要加,因为前几次循环的时候s的值已经改变 。清零
for(j=1;j<i;j++)
{
if(i%j==0)//这一块是如果能够整除,那么就是该数的因子,我们累加起来
{s+=j;
}
}
if(s==i) //因子的和与原数比较,如果正确就输出
{printf("%d\n",i);
sum++;
}
}
printf("完数的个数:%d\n",sum);
}
第2个回答 推荐于2016-07-15
以前写的。
/*一个数恰好等于它的因子之和.6=1+2+3*/
#include <stdio.h> /*头文件*/
#define N 1000 /*搜索范围在1000以内*/
int main(int argc, char *argv[]) /*主函数*/
{
int i; /*循环变量*/
for(i=1;i<=N;i++) /*循环找出小于N的所有完数并输出其因子.*/
{
if(wanshu(i)) print_factor(i);
continue;
}
return 0;
} /*主函数结束*/
int wanshu(int x) /*判断x是否完数*/
{
int i,sum=0;
// int factor[N]={0};
for(i=1;i<=x;i++) /*对所有x的因子求和*/
{
if(x%i==0) sum=sum+i;
continue;
}
if(sum==x*2) return(1); /*如果求和结果等于2x则x是完数*/
else return(0); /*否则不是完数*/
} /*完数判断函数结束*/
int print_factor(int x) /*打印结果*/
{
int i,j,res[1000]={0}; /*i,j为循环变量.res数组记录每个因子.*/
for(i=1;i<x;i++) /*将每个非零因子存在数组res[]中*/
{
if(x%i==0) res[i]=i;
continue;
}
printf("%d its factors are: ",x); /*打印提示*/
for(j=0;j<x;j++) /*打印每个因子,以逗号相隔.*/
{
if(res[j]!=0)
{
printf("%d",res[j]);
printf("\,");
}
}
printf("\n");
return(0);
} /*打印函数结束*/本回答被提问者采纳
第3个回答 2019-10-30
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
bool wanquan[5001];
void is_perfect_number()
{
int i,s=0;
for(int j = 1; j<=5000; j++){
for(i = 1; i <=j/2; i ++){
if(j%i == 0)
s+=i;}//统计所有真因子的和。
if(s == j) wanquan[j]=1;//如果与原值相等,则该数为完数。
s=0;
}
/* for (i=1;i<=5001;i++)
cout<<wanquan[i]<<endl<<endl;*/
}
完全数打表哈~~~
第4个回答 2007-01-13
没有优化。
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
int count,factor[1000];
int Factor(int n) // 因子之和
{
int i,sum = 1,nn = n;
count = 0;
for (i = 2; i < n; i ++)
{
if (n % i == 0)
{
sum += i;
factor[count ++] = i;
}
}
return sum;
}
int main()
{
int i;
printf("1000内的完数有\n");
printf("1\n");
for (i = 6; i <= 1000; i ++)
{
if (Factor(i) == i)
{
printf("%d\n",i);
}
}
return 0;
}