java求一万以内的完数_一些简单的java编程题(1) ————求10000以内的完数

版权声明:本文为博主原创文章,未经博主允许不得转载。

/* (程序头部注释开始)

版权声明:保留个人权利。 如程序有不当之处,敬请指正。

* 文件名称: 《一些简单的java编程题(1) ————求10000以内的完数》

* 作 者: 那就去巴黎

* 完成日期: 2018 年 01 月 29 日

* 版 本 号: JDK 9.0.1

问题描述:

若一个自然数,它所有的真因子(即除了自身以外的约数)的和恰好等于它本身,这种数叫做完全数,简称“完数” 。

例如: 6=1+2+3。

28=1+2+4+7+14 。

编写一个Java程序,找出 10000 以内的所有完数。

题目分析:

可以使用for循环,和求余数符号% 先求自然数的出所有的真因子,然后相加,如果等于此自然数本身则为完数。

* (程序头部的注释结束)

*/

package questions;

public class Q1

{

public static void main(String[] args)

{

int n=10000;

perfectNumber(n);

}

private static void perfectNumber(int n) // 编写一个perfectNumber 的方法来找出完数

{

System.out.println(n+"以内的完数为:");

for(int i=1;i

{

int sum=0;

for(int j=1;j

{

if(i%j==0) // 找出所有真因子

{

sum+=j; // 使所有找出的真因子一个个相加。

if(j==i/2 && sum==i) /* 此处的 j==i/2 是因为: 如 24=1+2+3+4+6+8 并不是所有真因子之和,缺了真因子12。 所以此处强制先行判断是否求出所有真因子。*/

{

System.out.print(i+" ");

}

}

}

}

}

}

程序运行结果如下:

136133de40ab0407f3d4cdfa7d40dca4.png

编程结束发现,如果去判断是否是所有真因子的相加,程序的编程思想复杂,可以进一步调整结构,改善程序。

改善程序如下:

package questions;

public class Q1_Test

{

public static void main(String[] args)

{

int n=10000;

perfectNumber(n);

}

private static void perfectNumber(int n)

{

System.out.println(n+"以内的完数有:"); //println 和 print 的区别是前者输出时换行

for(int i=1; i<=n; i++) // 此处就使用了 i<=n

{

int sum = 0;

for(int j=1; j

{

if(i%j ==0)

{

sum = sum + j; // sum+=j 是 sum=sum+j的简化写法。

}

}

if(sum == i) //当此处的判断 if 跳出第二个for循环时,不用判断是否所有真因子相加。

{

System.out.print(i+" "); // " " 内的空格是为了让显示的结果更清楚

}

}

}

}

程序运行结果如下:

d633f30feda2f44c1afca323a3531a93.png

疑问:

当设 n= 100,000,000时,或者n的数值更大时,程序无法运行出 8128之后的完数。   希望能有人解答下疑问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值