完美数字显示Java

完美数字显示Java,java,Java,我有以下的作业问题 如果一个数等于除其自身之外的所有因子之和,那么它就是一个完美数。例如,6是一个完美的数字,因为6=1+2+3 编写一个程序,获取一个输入数字,并显示包括该数字在内的所有完整数字 这就是我目前所拥有的 import java.util.*; public class perfectnumbers { public static void main(String[] args){ Scanner console = new Scanner(System.in);

我有以下的作业问题

如果一个数等于除其自身之外的所有因子之和,那么它就是一个完美数。例如,6是一个完美的数字,因为6=1+2+3

编写一个程序,获取一个输入数字,并显示包括该数字在内的所有完整数字

这就是我目前所拥有的

import java.util.*;
public class perfectnumbers
 {
public static void main(String[] args){
   Scanner console = new Scanner(System.in);
   
   int externalNumber;
 
   int internalNumber;
   int internalTotal = 0;
   
   System.out.println("Input Number");
   externalNumber = console.nextInt();
   
   while (externalNumber > 0) {
       internalNumber = externalNumber;
       while (internalNumber > 0) {
           internalNumber = internalNumber - 1;
           internalTotal = internalNumber + internalTotal;
        }
        if (internalTotal == externalNumber) {
            System.out.println(internalTotal);
        }
        externalNumber = externalNumber - 1;
        internalTotal = 0;
    }
}
}

但由于某种原因,当我输入一个数字时,只输出3。。。有人能帮忙吗?

你从不检查因素。这样做:

while (externalNumber > 0) {
    internalNumber = externalNumber-1;  //Make sure to subtract one here
    while (internalNumber > 1) { //Change this to 1 so you don't divide by 0
        internalNumber = internalNumber - 1;
        if (externalNumber%internalNumber==0){ //Check for factor
            internalTotal = internalNumber + internalTotal;
        }
    }
    if (internalTotal == externalNumber) {
        System.out.println(internalTotal);
    }
    externalNumber = externalNumber - 1;
    internalTotal = 0;
}
完美数字(像其他完美的东西一样)是非常稀少的

它们是(在
int
范围内):

(使用
long
时,仅剩下三个
8589869056、137438691328、2305843008139952128

因此,您可以这样实现它:

  private static int[] perfectNumbers = new int[] {
    6, 28, 496, 8128, 33550336
  };

  private static void displayPerfects(int upTo) {
    for (int item : perfectNumbers) 
      if (item > upTo)
        break;
      else {
        System.out.print(item); 
        System.out.println();
      }
  }

  ...

  public static void main(String[] args) {  
    ...
    System.out.println("Input Number");
    ...
    externalNumber = console.nextInt();
    ...
    displayPerfects(externalNumber);
  }

请注意,在您的情况下,效率确实很重要,例如,如果您被给予,比如说,
2000000000
,需要多长时间?你所要做的就是最多测试五个值。

你试过调试这个问题吗?是的,我试过了,每个数字只给我3,只有3。你在哪里检查它是否是一个因子?哦,等等@gonzo Im dumb我没有做因子,我只是减去了thanxin有趣的问题:注意效率(“…显示所有完美的数字…”)在这里真的很重要。如果我们被给予,比如说,
2000000000
(高达20亿),效率在这个问题上很重要:想象一下,你被给予,比如说,
2000000000
——程序需要多少时间来“显示所有完美的数字,包括那个数字”?您已根据问题要求修改了错误more@DmitryBychenko是的,我同意。我只是回答OP的问题,为什么“只有3个被输出…”嗨,Dmitry,我是落选者(我回复了它)。你的答案很完美,但OP的要求涉及家庭作业,我认为你的解决方案超出了作业的教学目的。干杯。@Andrea:正如我所看到的,家庭任务致力于基本因子分解,而被接受的解决方案必须总结因子。然而,在实践中,由于效率的原因,我们不应该以这种方式实施(10亿美元的投入将永远冻结整个系统)。所以我不认为我破坏了乐趣:我已经给出了测试的参考代码,展示了工作,即实际解决方案,但还没有完成家庭作业(我怀疑我的程序是否会被接受)。是的,我明白你的意思,我同意效率方面的观点!事实上,我认为这种请求也不适合课堂作业。
  private static int[] perfectNumbers = new int[] {
    6, 28, 496, 8128, 33550336
  };

  private static void displayPerfects(int upTo) {
    for (int item : perfectNumbers) 
      if (item > upTo)
        break;
      else {
        System.out.print(item); 
        System.out.println();
      }
  }

  ...

  public static void main(String[] args) {  
    ...
    System.out.println("Input Number");
    ...
    externalNumber = console.nextInt();
    ...
    displayPerfects(externalNumber);
  }