版權聲明:本文爲博主原創文章,未經博主允許不得轉載。
/* (程序頭部註釋開始)
版權聲明:保留個人權利。 如程序有不當之處,敬請指正。
* 文件名稱: 《一些簡單的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<n+1;i++) // 循環 10000 及以內的數, 此處 i<n+1 也可以寫成 i<=n
{
int sum=0;
for(int j=1;j<i/2+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+" ");
}
}
}
}
}
}
程序運行結果如下:
編程結束髮現,如果去判斷是否是所有真因子的相加,程序的編程思想複雜,可以進一步調整結構,改善程序。
改善程序如下:
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<i; j++) // 此for循環內,所有真因子直接相加。
{
if(i%j ==0)
{
sum = sum + j; // sum+=j 是 sum=sum+j的簡化寫法。
}
}
if(sum == i) //當此處的判斷 if 跳出第二個for循環時,不用判斷是否所有真因子相加。
{
System.out.print(i+" "); // " " 內的空格是爲了讓顯示的結果更清楚
}
}
}
}
程序運行結果如下:疑問:
當設 n= 100,000,000時,或者n的數值更大時,程序無法運行出 8128之後的完數。 希望能有人解答下疑問。