一些簡單的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<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之後的完數。   希望能有人解答下疑問。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章