完美的数字

时间:2013-09-09 09:02:26

标签: java list arraylist numbers perfect-numbers

我在java中尝试了这个程序,用于最多1000个整数的有界常量输入。没有得到预期的输出:(

package perfect.numbers;
import java.util.ArrayList;
public class PerfectNumbers {

    public static void main(String[] args) {
        long num=1000; int sum = 0;
        ArrayList<Integer> perfectList = new ArrayList<>();
        ArrayList<Integer> factorList = new ArrayList<>();
        for(int i=1; i<num; i++)
        {
           for(int j=1; j<i/2; j++)
           {         
                if(i%j==0)
                {
                    factorList.add(j);
                }

                for(int h=0; h<factorList.size(); h++)
                    sum=sum+factorList.get(h);

                if(sum==i)
                perfectList.add(i);
                sum=0;
            }
        }

        System.out.println("The Perfect numbers upto 1000 are : ");

        for(Integer item : perfectList)
        {
            System.out.print(item + "/t");
        }
    }
}

6 个答案:

答案 0 :(得分:2)

您的代码有多个问题:

  1. factorList未清除
  2. 例如6是一个完整的数字= 1 + 2 + 3但是for循环停止在2.(j <3)
  3. 我也有第三个内在因为我离开了第二个内部for循环。
  4. 这是正确的版本:

    import java.util.ArrayList;
    
    public class PerfectNumbers {
    
        public static void main(String[] args) {
            long num = 1000;
            int sum = 0;
            ArrayList<Integer> perfectList = new ArrayList<>();
            ArrayList<Integer> factorList = new ArrayList<>();
            for (int i = 6; i < num; i++) {
                factorList.clear();
                for (int j = 1; j <= i / 2; j++) {
                    if (i % j == 0) {
                        factorList.add(j);
                    }
                }
                sum = 0;
                for (int h = 0; h < factorList.size(); h++) {
                    sum = sum + factorList.get(h);
                }
                if (sum == i) {
                    perfectList.add(i);
                }
    
            }
            System.out.println("The Perfect numbers upto 1000 are : ");
            for (Integer item : perfectList) {
                System.out.print(item + "/t");
            }
        }
    }
    

答案 1 :(得分:1)

我认为你的Inner for循环应该是这样的:

for(int j=1; j<=i/2; j++)
{         
       if(i%j==0)
       {
                factorList.add(j);
       }
}
for(int h=0; h<factorList.size(); h++)
      sum=sum+factorList.get(h);

if(sum==i)
perfectList.add(i);
sum=0;

这里我在执行总和之前关闭了内部forloop。在你的情况下发生了什么,每当一个满足条件i%j==0的新数字,总和被计算,如果总和不等于i,则sum被重置为0.这导致问题。

我将内部for循环更改为j<=i/2。解释:取i = 6.而我们知道因子为6:1,2,3。现在如果j<i/2是循环内部,那么它将忽略数字3并退出该实例,因此我们永远不会在因子列表中得到3。希望这能回答你所有的问题。

答案 2 :(得分:1)

通过谷歌找到答案,根据您的要求更新

您期望低于输出

最多1000的完美数字是: 0 6 28 496

public class PerfectNumbers {   
    public static boolean  isPerfectNumber(int number){        
        int temp = 0;
        for(int i=1;i<=number/2;i++){
            if(number%i == 0){
                temp += i;
            }
        }
        if(temp == number){           
            return true;
        } else {            
            return false;
        }
    }

 public static void main(String[] args) {
    System.out.println("The Perfect numbers upto 1000 are :");
     for (int i=0;i<= 1000; i++){
         if(PerfectNumbers.isPerfectNumber(i)){
            System.out.println(i);
         }
     }              
 } 
}

答案 3 :(得分:1)

  1. 将和计算代码从第二个循环移动到第一个循环。
  2. 总和计算后清除factorList。

答案 4 :(得分:1)

你的内循环中存在一个明显的问题(即for循环,j作为索引变量):你的结束测试是j<i/2。这将终止循环,以使j永远不会达到i/2,但每个偶数整数i在其适当的除数中都有i/2。您需要将结束测试更改为j <= i/2

您可能还希望将外部循环中的结束测试更改为i <= num。否则,您只会检查最多num - 1的整数。

你还需要移动总和计算并检查内部循环到外部循环,因为你想对每个潜在的完美数字只做一次,而不是每个潜在的正确除数。

答案 5 :(得分:0)

/*
@ Author 12CSE54
@ Date 28.10.14
*/

import java.util.*; 

public class perfect {
    Scanner s = new Scanner(System.in);

    public void check() {
        System.out.println("Enter the number\n");
        int p = sc.nextInt();
        int temp = 0;

        for(int i = 1; i <= p / 2; ++i) {
            if (p % i == 0)
                temp += i;
        }

        if (temp == p)
            System.out.println("It is a perfect number");
        else 
            System.out.println("It is not a perfect number");
    }

    public static void main(String args[]) {
        perfect p1 = new perfect();
        p1.check();
    }
}