0

我在 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");
        }
    }
}
4

6 回答 6

2

您的代码有多个问题:

  1. 因子列表未清除
  2. 例如 6 是一个完美的数字 = 1+2+3 但 inter for 循环在 2 处停止。 (j<3)
  3. 我还有第三个内部 for 我移出了第二个内部 for 循环。

这是正确的版本:

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");
        }
    }
}
于 2013-09-09T09:08:18.893 回答
1

我认为你的内部 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,则总和将重置为 0。这会导致问题。

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

于 2013-09-09T09:07:57.303 回答
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);
         }
     }              
 } 
}
于 2013-09-09T09:11:42.827 回答
1
  1. 将总和计算代码从第二个循环移动到第一个循环。
  2. 求和后清除factorList。
于 2013-09-09T09:18:54.123 回答
1

您的内部循环(即for带有jas 索引变量的循环)中有一个明显的问题:您的最终测试是j<i/2. 这将终止循环,因此j永远不会到达i/2,但每个偶数整数i都有i/2其适当的除数。您需要将最终测试更改为j <= i/2.

您可能还想将外部循环中的结束测试更改为i <= num. 否则,您将只检查不超过 的整数 num - 1

您还需要将总和计算并从内部循环检查到外部循环,因为您只想对每个潜在的完美数字执行一次,而不是对每个潜在的适当除数。

于 2013-09-09T09:19:27.117 回答
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();
    }
}
于 2014-10-28T11:21:58.293 回答