【问题标题】:Printing Perfect Numbers between 1-100 using Java使用 Java 打印 1-100 之间的完美数字
【发布时间】:2019-02-05 16:20:19
【问题描述】:

我不知道我的代码有什么问题。它应该打印 1-100 之间的所有完美数字。我尝试使用嵌套的 for 循环、执行 while 循环和 for 循环。但是,代码似乎不正确。

class CompProject1
{

    public static void main()

    {

        int num, sum=0;

        int i;

        for(num=1; num<100; num++)

        {

           for(int j = 1; j<=num ; j++)

           {

               if(num%j==0)

               {

                   sum = sum+j;

                }

            }

           if(sum==num)

           {

             System.out.println(sum);  

            }
        }
    }
}

【问题讨论】:

  • 确切的问题陈述是什么?因为你也许可以逃脱System.out.println("6, 28");
  • @jsheeran,来吧老兄,这是一个编程作业

标签: java for-loop nested-loops perfect-numbers


【解决方案1】:

这似乎是一个作业或家庭作业问题。您应该自己解决这个问题,而不是向 Stack Overflow 上的人询问。

但是,您正在寻找的答案是here。谨防!此代码打印输入数字是否为完美数字,但不会打印所有低于 100 的可能是完美数字的数字。那是你的功课。

【讨论】:

    【解决方案2】:

    1) 您肯定需要为每次迭代重置 sum 变量,因此您应该在每个循环中执行 int sum = 0;

    2) 你需要在 j &lt;= num/2;! 时进行迭代!

    3) 考虑使用 Java 8,我会在这里为您编写一些示例。

    在这里看我的例子,这太漂亮了:

    public class PerfectNumbersDemo {
    
      public static void main(String[] args) {
        IntStream.range(1, 100)
            .filter(PerfectNumbersDemo::isPerfect)
            .forEach(System.out::println);
      }
    
      private static boolean isPerfect(int number) {
        return number == IntStream.rangeClosed(1, number / 2)
            .filter(i -> number % i == 0)
            .sum();
      }
    }
    

    【讨论】:

      【解决方案3】:

      将您的代码更改为:

      public static void main(String[] s1) throws Exception {
          int num, sum = 0;
          int i;
          for (num = 1; num < 100; num++) {
              for (int j = 1; j <= num - 1; j++) {   // change made here
                  if (num % j == 0) {
                      sum = sum + j;
                  }
              }
              if (sum == num) {
                  System.out.println(sum);
              }
              sum = 0;                              // change made here
          }
      
      }
      

      关键要点:

      1. 内部迭代完成后将 sum 重置为 0
      2. 在您的innerfor-loop 中,您需要检查是否直到 num - 1 而不是 num,因为每个数字都可以被自己整除

      【讨论】:

      • 他实际上应该迭代到 num/2,你的答案对于解决他面临的问题很好,但在优化的情况下不太好
      • you 需要什么优化才能打印 1-100 的完美数字?它不会有任何区别。你的反对票太荒谬了。
      • 你怎么知道它是我的?事情甚至不是关于优化,而是关于正确的数学模型。
      • 如果他需要评估前 1.000.000 个数字的值怎么办?
      • 1.很明显你投了反对票(因为同时有评论) 2. 我为什么要关心它是否达到 1,000,000?问题明确指出 1 - 100。这也不是关于性能的问题。
      【解决方案4】:

      你需要:

      • sum = 0 每次循环迭代
      • 迭代直到&lt; num 而不是&lt;= num

      这是固定代码:

      public static void main(String[] args)  {
      
      int sum;
      for(int num = 1; num < 100; num++) {
      
          sum = 0;
      
          for(int j = 1; j< num; j++) {
              if(num % j == 0) {
                  sum += j;
              }
          }
      
          if(sum == num) {
              System.out.println(sum);
          }
      }
      

      }

      输出:

      6
      28

      【讨论】:

      • 这是正确答案,应该这样标记
      • 为什么你们要在循环外初始化 sum,因为 int 有缓存?看起来很丑……
      【解决方案5】:

      所以,你的代码有一些小问题,我会试着找出它们。

      1.首先你的 sum 变量应该在第一个 for 循环中
      2. 第二个循环运行的上限将是j&lt;num 而不是j&lt;=num,因为对于完美数字,数字本身不应计入总和。

      您的代码将如下所示。

      我不知道我的代码有什么问题。它应该打印 1-100 之间的所有完美数字。我尝试使用嵌套的 for 循环、执行 while 循环和 for 循环。但是,代码似乎不正确。

      class CompProject1 {
      
      public static void main()
      
      {
      
           int num;
      
           for(num=1; num<100; num++)
      
           {
      
               int sum = 0;
      
               for(int j = 1; j<=num ; j++)
      
               {
      
                    if(num%j==0)
      
                    {
      
                     sum = sum+j;
      
                    }
      
             }
      
             if(sum==num)
      
             {
      
              System.out.println(sum);  
      
              }
          }
       }
      }
      

      【讨论】:

        【解决方案6】:
        public class factors{
        public static void main(String args[]){
            int sum=0;
        
            for(int k=2;k<=30;k++){
            for(int i=1;i<k;i++)
            {
                if(k%i==0)
                    sum=sum+i;
        
        
            }
               if(k==sum)
                     System.out.println(sum);
        
        
                sum=0;          //sum=0 is very important.
            }
        
        }
        

        }

        输出

        6
        28
        

        【讨论】:

          猜你喜欢
          • 2023-03-19
          • 1970-01-01
          • 2019-11-16
          • 2015-10-14
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多