一、完数的判断
1.问题描述
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
2.输入格式
N
3.输出格式
? its factors are ? ? ?
4.输入样例
1000
5.输出样例
6 its factors are 1 2 3
28 its factors are 1 2 4 7 14
496 its factors are 1 2 4 8 16 31 62 124 248
6.我的想法
从2开始遍历到需要的数字命名为num,再从1遍历到num-1,求出num除本身的数以外的因子,并将所有的因子存放在数组里,方便后续的输出;在最里层的循环用factor初始化为num,用factor减去所求的因子,当factor==0时就是我们所需的完数(减少多重循环造成的运行的时间过长)。
二、C语言
代码如下:
#include<stdio.h>
int main()
{
int N,num,factor,x[100],j;
scanf("%d",&N);
for(num=2;num<=N;num++)
{
factor=num;j=0;
for(int i=1;i<num;i++)
{
if(num%i==0)
{
x[j]=i;j++; //将num的因子存放在数组里
factor=factor-i;
}
}
if(factor==0)
{
printf("%d ""its factors are ",num);
for(int k=0;k<j;k++)
printf("%d ",x[k]);
printf("\n");
}
}
return 0;
}
当输入1000时的输出:
二、C++
代码如下:
#include<iostream>
using namespace std;
int main()
{
int N,num,factor,x[100],j;
cin>>N;
for(num=2;num<=N;num++)
{
factor=num;j=0;
for(int i=1;i<num;i++)
{
if(num%i==0)
{
x[j]=i;j++; //将num的因子存放在数组里
factor=factor-i;
}
}
if(factor==0)
{
cout<<num<<' '<<"its factors are ";
for(int k=0;k<j;k++)
cout<<x[k]<<' ';
cout<<endl;
}
}
return 0;
}
三、Java
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int[] x = new int[100];
int num,factor,j;
for(num=2;num<=N;num++)
{
factor=num;j=0;
for(int i=1;i<num;i++)
{
if(num%i==0)
{
x[j]=i;j++; //将num的因子存放在数组里
factor=factor-i;
}
}
if(factor==0)
{
System.out.print(num+" "+"its factors are ");
for(int k=0;k<j;k++)
System.out.print(x[k]+" ");
System.out.println();
}
}
}
}
总结
欢迎大家批评指正!