2016-11-21 66 views
1

您好,这是我第一次在这里问一个问题,我读了指导原则,我找了一个答案,没有找到一个,所以我希望我的问题是在指导方针。无论如何,我被困在一个简单的Java练习中,我必须输出前N个完美数字(在数论中,一个完美数字是一个正整数,它等于它正确的正因数之和,即它的总数不包括本数(也被称为其等分总和)正除数)。所以我做了这个Pefect Number Java

import java.util.Scanner; 

public static void main(String[] args) { 

    Scanner in = new Scanner(System.in); 

    int cont = 0; 
    int num = 1; 
    int soma = 0; 
    System.out.println("Quantos números perfeitos?"); 
    int n = in.nextInt(); 

    while (cont < n) { 
     for (int i = 1; i <= num/2; i++) { 
      if (num % i == 0) { 
       soma = soma + i; 
      } 
     } 

     if (num == soma) { 
      System.out.println(num + " é perfeito."); 
      cont++; 
     } 
     num++; 

    } 
} 

它陷在一个无限循环,我无法找出原因。无论如何,如果有人可以帮助我,我会很感激,如果我的问题已经得到解答,或者如果这只是一个愚蠢的问题抱歉,正如我所说,这是我第一次问。谢谢。

+1

欢迎StackOverflow上。如果你有一个集成的开发环境,我建议你在几行放置断点,特别是soma = soma + i和if(num == soma)。 (如果你没有IDE,请将System.out.println中的一些重要变量) – rajah9

+0

可能是因为'cont ++'只是在完美数字时才会增加。第一个非完美的号码会卡在循环中。我认为while循环条件应该是'while(num AntonH

+0

只是一般性的建议,而不是答案,这可能对你来说显然很明显,但这可能是一个问题,for循环永远不会产生一个数字,其中'soma == num'。因此,“cont ++”永远不会被执行,因此“cont SpencerD

回答

6

你的代码看起来不错 - 你忘记做的唯一的事情是每次在while循环中重置soma的值。在你当前的代码中,soma是你到目前为止所穿过的数字的合适因子的总和,这并不是你想要的。

这里有你需要的代码:

Scanner in = new Scanner(System.in); 

int cont = 0; 
int num = 1; 
int soma; 
System.out.println("Quantos números perfeitos?"); 
int n = in.nextInt(); 

while (cont < n) { 
    soma = 0; //Don't forget this line 

    for (int i = 1; i <= num/2; i++) { 
     if (num % i == 0) { 
      soma = soma + i; 
     } 
    } 

    if (num == soma) { 
     System.out.println(num + " é perfeito."); 
     cont++; 
    } 

    num++; 
} 
+2

我不知道为什么这个投票结果是否下降。这是正确的答案。 – Andreas

+0

你真的运行过它来确定它修复了无限循环吗?我想你会发现还有其他的错误(如果num!= soma会发生什么) – John3136

+2

是的,我测试了它,它似乎工作。 n = 3的输出:6éperfeito。 28éperfeito。 496éperfeito.' – 416E64726577