我目前正在网站上进行挑战,检查数字是否为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;
}
对于更好的实施或更正的任何建议将不胜感激。它确实给出了结果,但它们是不正确的。感谢
答案 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);
}
希望这有帮助!