A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM张博文 高级黑马   /  2013-5-27 21:54  /  2627 人查看  /  7 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 HM张博文 于 2013-5-28 09:28 编辑

如果一个正整数等于除它本身之外其他所有除数之和,就称之为完全数。例如:6是第一个完全数,因为6=1+2+3.下一个完全数是28=14+7+4+2+1。10000以下的完全数总共也只有4个,请编写程序,找出这4个完全数并打印出来。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

7 个回复

正序浏览
风爽 中级黑马 2013-5-28 18:21:33
8#
风爽 发表于 2013-5-27 22:42
运行结果只有三个:6,28,496

没看清题,我写的是1000以内的
回复 使用道具 举报
非常好  同学
回复 使用道具 举报

public class Test3 {
        public static void main(String[] args){
                int sum;//除数的和
                String str;//是为了输出有那几个数整除的数;
                for(int i=3;i<10000;i++){//很容易就能判断出1,2,3不是完全数,所以可以直接从3开始
                        sum=0;
                        str="=1";//每次进入时重新复制
                        int k=i/2+1;//因为一个除数最大也就是被除数的1/2所以此处可以除以2+1来优化程序,减少执行时间,提高效率
                        for(int j=1;j<=k;j++){
                                if(i%j==0){
                                    sum+=j;
                                    if(j!=1)//这地方需要过滤掉1
                                            str+="+"+j;
                                }
                        }
                        if(sum==i){
                                System.out.println(sum+str);
                        }
                }
        }

}

image.jpg (31.15 KB, 下载次数: 0)

image.jpg

点评

有程序也有注释,非常专业的解答,非常感谢啊  发表于 2013-5-28 09:18

评分

参与人数 2技术分 +2 黑马币 +3 收起 理由
袁梦希 + 2 赞一个!
HM张博文 + 3 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 棉/mg花/x糖 于 2013-5-27 23:25 编辑

程序改进,源码如下:
  1. package com.yb.FindPerfectNumber;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;

  5. public class FindPerfectNumber {
  6.     static void findPerfectNum(int n) {
  7.         int i,j,s,k = 0;
  8.         for(i = 1; i <= n; i++) {
  9.             s = 0;
  10.             for(j = 1; j < i; j++) {
  11.                 if(i%j == 0) s += j;
  12.             }
  13.             if(s == i) {
  14.                 System.out.print(i+" = ");
  15.                 for(j = 1; j < i/2; j++)
  16.                     System.out.print(i%j==0 ? j+"+":"");
  17.                 System.out.println(i/2);         //输出最后一个因子
  18.                 k++;
  19.             }
  20.         }
  21.         System.out.println("\n"+n+"之内的完全数共有 "+k+" 个!");
  22.     }

  23.     public static void main(String []args) throws IOException {
  24.         System.out.println("请从键盘输入一个整数n(n<2147000000):");
  25.         BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in));
  26.         String ch = keyin.readLine();
  27.         int n = Integer.parseInt(ch);
  28.         System.out.println("\n要寻找 "+n+"以内的完全数:\n");
  29.         findPerfectNum(n);
  30.     }
  31. }
复制代码
运行效果截图:

点评

谢谢你,这位美女同学  发表于 2013-5-28 09:17
回复 使用道具 举报
  1. public class Demo {
  2.         public static  void main(String[] args)
  3.         {
  4.                 for(int i = 1; i <=1000; i++)
  5.                 {
  6.                         int sum = 0;
  7.                         for(int j = 1; j < i - 1; j++)
  8.                         {
  9.                                 if(i % j == 0)
  10.                                 {
  11.                                         sum = sum + j;
  12.                                 }
  13.                         }
  14.                         if(sum == i)
  15.                                 System.out.println(sum);
  16.                 }
  17.         }
  18. }
复制代码
运行结果只有三个:6,28,496

点评

你的结果怎么少了一个呢?  发表于 2013-5-28 09:15

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 少一个

查看全部评分

回复 使用道具 举报
本帖最后由 棉/mg花/x糖 于 2013-5-27 22:34 编辑

正好前两天写过这样一个程序,哈哈,看下面代码,希望能帮到你^_^
  1. package com.yb.FindPerfectNumber;

  2. public class FindPerfectNumber {
  3.     public static void main(String []args) {
  4.         int i,j,s,n = 0;
  5.         for(i = 1; i <= 1000; i++) {
  6.             s = 0;
  7.             for(j = 1; j < i; j++) {
  8.                 if(i%j == 0) s += j;
  9.             }
  10.             if(s == i) {
  11.                 System.out.print(i+" = ");
  12.                 for(j = 1; j < i/2; j++)
  13.                     System.out.print(i%j==0 ? j+"+":"");
  14.                 System.out.println(i/2);                 //输出最后一个因子
  15.                 n++;
  16.             }
  17.         }
  18.         System.out.println("\n1000之内的完全数共有 "+n+" 个!");
  19.     }
  20. }
复制代码
运行效果截图:

点评

谢谢,我说的是10000,不过算法是一样的,还是谢谢你  发表于 2013-5-28 09:16

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
  1. package heimeTest;
  2. public class Test4{
  3.         public static void main(String[] args) {
  4.                 getCompleteNumber();//6,28,496,8128
  5.         }
  6.         public static void getCompleteNumber(){
  7.                 for(int i = 1;i<=10000;i++){
  8.                         int sum = 0;
  9.                         for(int j = 1;j<i;j++){
  10.                                 if(i%j==0){
  11.                                         sum+=j;
  12.                                 }
  13.                         }
  14.                         if(sum == i){
  15.                                 System.out.println(i);
  16.                         }
  17.                 }
  18.         }
  19. }
复制代码

点评

谢谢了哈  发表于 2013-5-28 09:15

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马