【问题标题】:Perfect numbers完美的数字
【发布时间】:2014-10-28 19:47:02
【问题描述】:

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

【问题讨论】:

  • 你得到了什么输出?
  • 你期待什么?
  • 可能是完美的数字?
  • 我已经编辑了你的类,所以它看起来像一个普通的代码,写代码时请记住这一点
  • @kocko - 我得到一个空白输出,只有“直到 a000 的完美数字是:”

标签: java list arraylist numbers perfect-numbers


【解决方案1】:

您的代码有多个问题:

  1. factorList 未清除
  2. 例如 6 是一个完美数 = 1+2+3,但 for 循环在 2 处停止。(j
  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");
        }
    }
}

【讨论】:

  • 完美数字的完美答案
【解决方案2】:
  1. 将总和计算代码从第二个循环移到第一个循环。
  2. 求和后清空factorList。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      你期望低于输出

      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);
               }
           }              
       } 
      }
      

      【讨论】:

      • 8128 大于 1000 :)
      • 谢谢,更新了代码。 Typeo,而不是 i
      【解决方案5】:

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

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

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

      【讨论】:

      • 感谢您的解释(y)
      【解决方案6】:
      /*
      @ 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        相关资源
        最近更新 更多