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

/* (程序头部注释开始)
版权声明:保留个人权利。  如程序有不当之处,敬请指正。

* 文件名称:    《一些简单的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之后的完数。   希望能有人解答下疑问。







更多推荐

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