2014-02-07 3 views
0

В настоящее время я делаю вызов на веб-сайте, чтобы проверить, является ли число Happy Number или нет. Программа должна читать в файле со списком чисел, по одному на каждой строке и определять, является ли это счастливым числом. У меня возникли проблемы с реализацией проверки, чтобы убедиться, что номер счастлив или нет.Проверка, является ли число счастливым числом или нет Java

Счастливая часть довольно прямолинейная, если она добирается до 1, это счастливое число. Проблема возникает для меня, если номер не счастлив, что никогда не будет 1 и будет оставаться в бесконечном цикле, так что я не уверен в том, чтобы отслеживать, что успешно

Вот код:

package com.jconnolly.codeeval; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 

public class HappyNumbers { 

public static void main(String[] args) { 

    HappyNumbers hn = new HappyNumbers(); 
    File file = new File(args[0]); 
    BufferedReader br; 
    String[] numbers; 
    try { 
     // Read in file 
     br = new BufferedReader(new FileReader(file)); 
     String line; 
     // Store each line as a string in an array 
     while((line = br.readLine()) != null) { 
      numbers = line.split("\n"); 
      for(int i = 0; i < numbers.length; i++) { 
       if(hn.isHappy(numbers[i])) { 
        System.out.println(1); 
       } else { 
        System.out.println(0); 
       } 
      } 
     } 
     System.exit(0); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     System.exit(-1); 
    } 
} 

// Separates digits, squares them and adds them together 
public boolean isHappy(String str) { 

    int sum = 0; 
    // Holds numbers after they are squared and added together 
    ArrayList<Integer> happy = new ArrayList<Integer>(); 
    // Separates the digits to be squared 
    while((sum != 1) && !happy.contains(sum)) { 

     for(int i = 0; i < str.length(); i++) { 
      Character c = new Character(str.charAt(i)); 
      String character = c.toString(); 
      int digit = Integer.parseInt(character); 
      sum += (digit * digit); 
     } 
     happy.add(sum); 
    } 
    happy.clear(); 
    return sum == 1; 
} 

Любые советы по лучшей реализации или исправлению будут очень благодарны. Это дает результаты, но они неверны. Спасибо

+5

Этот вопрос не соответствует теме, потому что он принадлежит http://codereview.stackexchange.com/ –

+0

Это можно сделать, используя рекурсию? – asaini007

+0

@ asaini007 Обнаружение цикла больше 2 будет сложным с рекурсией. – Rainbolt

ответ

4

Единственный способ, с помощью которого я могу проверить тест «никогда не достигает 1», - это распознать, когда вы повторно тестируете значения, которые вы уже тестировали, что покажет, что вы попали в цикл, где все номера в этом цикле недовольны. Создайте словарь оттуда и используйте его, чтобы быстрее распознать другие несчастливые номера. Я считаю, что для этой формулы это действительно практично; для некоторых это может и не быть.

1

Попробуйте следующее isHappy() method; Я думаю, что рекурсия самого элегантным решения, но список необходим для предотвращения ввода цикла:

ArrayList<Integer> checked = new ArrayList<Integer>(); // used to tell if a number has already been checked 
public boolean isHappy(int i) { 
    if(i == 1) 
     return true; 
    for(int j : checked) 
     if(i == j) 
      return false 
    int nextNum = ...; // generate the next number (sum the squared digits of i) 
    checked.add(nextNum); 
    return isHappy(nextNum); 
} 

Надеется, что это помогает!

Смежные вопросы