【问题标题】:Perfect numbers 1 to n完美数字 1 到 n
【发布时间】:2020-06-14 13:28:12
【问题描述】:

编写一个算法,打印从 1 到 n 的完美数。确定一个数是否完美,将小于该数的所有因数相加。如果总和等于数字,那就完美了。

import java.util.Scanner;

public class Assign_6 {

    public static void main(String[] args){

        int num,number,sum=0,factor;

        System.out.print("Enter Number");
        Scanner keyboard = new Scanner (System.in);

        number=keyboard.nextInt();

        for (num=1;num<number;num++){
            for(factor=1;factor<number;factor++){
                if(num%factor==0){
                    sum= sum+factor;
                }
                if(sum==num){
                    System.out.println(sum);
                }
                sum=0;
            }

        }
    }
}

输出:24

没有打印出来。不知道怎么回事。我哪里错了?我只能使用 while、for 和 else-if 语句。

【问题讨论】:

  • 这听起来是学习如何使用调试器的完美情况;-)
  • 删除了我的答案,因为我给出了答案而不是线索......首先,您需要确保您的代码格式正确。正确格式化后,代码在做什么就很清楚了。
  • @user605989 您正在比较“sum==num”而不是“sum==number”
  • @Dave O 他做得对。该程序应该打印 1 和 n 之间的所有完美数字,包括 1 和 n。

标签: java if-statement for-loop perfect-numbers


【解决方案1】:

打印出每个数字的总和(不仅仅是当 sum==number 时),您就可以算出来了。

(两条线索:正确的缩进有助于快速找到匹配的 { } 对。为变量提供描述性名称是值得的。)

【讨论】:

  • 我试过了。现在它打印出所有小于我输入的数字的数字。它不会挑选出完美的数字。
  • @user605989 它打印出的数字比它应该打印的多得多,不是吗?其中很多都是零。
  • 我不确定到底是什么问题。我尝试过不同的缩进。我不知道这是否正确。
  • @user605989 这意味着循环有问题,System.out.print 在错误的位置。大量的零和也是sum=0 行错误的线索。
  • 更正的缩进线索是为了帮助您确定某些操作在您的 for 循环中发生的位置。重新阅读他刚刚给出的 Biziclop 的评论,您会看到有关打印大量 0 的提示。
【解决方案2】:

你的代码有两个问题:

  1. 下面的代码应该使用小于等于比较,否则,你错过了n,只做1到(n-1)

    for (num = 1;num < number;num++){
    

    应该是下面的代码。

    for (num = 1;num <= number;num++){
    
  2. 以下代码在for(factor=1;...) 内,但它应该在循环之外。否则,您实际上检查并清除每个因素的总和。

    if(sum==num){System.out.println(sum);} sum=0;} 
    

【讨论】:

    【解决方案3】:

    在纸上跟踪您的程序。您的 sum 变量存在问题。

    【讨论】:

      【解决方案4】:

      当你开始编码时很容易混淆你的循环,因为在这个作业中你有 2 个 for 循环,它们做不同的事情。作为提示,您的程序无法运行的原因是因为您将一个 for 循环中的内容放错了位置。

      您的方向是正确的,但请确保您能够单独考虑那些 for 循环。也就是说,内部循环的预期目的是什么?它实际上在做什么?外循环的预期目的是什么,它实际上在做什么?看起来在您的内部循环中,您正在尝试总结 num 的因素。它实际上只是总结了因素,还是您忽略了一些副作用/错误?

      【讨论】:

        【解决方案5】:

        试试这个代码,它会帮助你:

        import java.util.Scanner;
        
        public class Test
        {
           public static void main (String[] args)
           {
               Scanner in = new Scanner(System.in);
               int n = in.nextInt();
               for(int j=1; j<n; j++)
               {
                   int counter = 0;
                   for (int i = 1; i < j; i++)         
                   {              
                       if(j%i ==0)
                       {
                           counter = counter + i;
                       }
                   }
                   if(counter == j)
                       System.out.println(j);//here you can print j or counter
               }
           }
        }
        

        【讨论】:

          【解决方案6】:
          public class PerfectNumber {
          public static void main(String args [])
          {
          
              perfectNumber(6,200);
          }
          
          static void perfectNumber(int num1, int num2){
          
              int i; int j; int sum=0;
          
               for (i=num1;i<=num2;i++){
                      for(j=1;j<=i/2;j++){
                          if(i%j==0){
                              sum= sum+j;
                          }
          
                      }
                      if(sum==i){
                          System.out.println("The perfect number between two numbers: "+sum);
                      } 
                      sum=0;
                  }
          
          
              }
          

          }

          【讨论】:

            【解决方案7】:
            import java.util.*;
                class PerfectNumber
            
            {
            
            public static void main(String[]args)
            {
                System.out.println("Enter the number upto which you want to print the perfect number");
                Scanner scan=new Scanner(System.in);
                int n=scan.nextInt();
                for(int i=1;i<=n;i++)
                {
                    int sum=0;
                    for(int j=1;j<=i;j++)
                    {
                        if(i%j==0)
                        sum=sum+j;
                    }
                    if(sum==(2*i))  //checks for perfect number
                    System.out.println(i);
                }
            
                }
            }
            

            【讨论】:

              【解决方案8】:
              #include<iostream>
              using namespace std;
              int main()
              {
                int start,end;
                cin>>start>>end;
                for(int j = start;j<=end;j++)
                {
                  int div=0;
                 for(int i =1;i<j;i++)
                {
                  if(j%i == 0)
                  {
                    div = div+i;
                  }
                }
                  if(div==j)
                  {
                    cout<<j<<" ";
                  }
                }
               return 0; 
              }
              

              【讨论】:

              • 你好 Shyam,欢迎来到 StackOverflow。您能否对您的代码进行一些解释,以及为什么当问题涉及 Java 时您为 C 或 C++ 提供解决方案?
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-03-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-07
              相关资源
              最近更新 更多