检查数字是否为Happy数字是否为Java

时间:2014-02-07 21:31:18

标签: java

我目前正在网站上进行挑战,检查数字是否为Happy Number。该程序将读入一个带有数字列表的文件,每行一个,并确定它是否是一个满意的数字。我在执行检查时遇到了一些麻烦,看看号码是否满意。

快乐的部分是相当直接的,如果它达到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;
}

对于更好的实施或更正的任何建议将不胜感激。它确实给出了结果,但它们是不正确的。感谢

2 个答案:

答案 0 :(得分:4)

我能想到测试“永不达到1”的唯一方法是识别你重新测试你已经测试过的值,这会显示你陷入了一个循环,其中所有的数字都在那里循环不开心。从那里建立一个字典,并用它来更快地识别其他不愉快的数字。我相信这个公式实际上是实用的;对某些人来说,可能不是。

答案 1 :(得分:1)

尝试以下isHappy()方法;我认为递归是最优雅的解决方案,但需要一个列表来防止进入循环:

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);
}

希望这有帮助!