「プログラミング課題」から「3n + 1問題」を実行するのに問題があります。UVaで3n + 1チャレンジ
Googleで見つけられるJavaのすべてのソリューションを試しましたが(Stack Overflowのものでさえも)、1つではなく、すべて「誤った回答」と報告されています。私はC++の実用的なソリューションを見つけて、それをJavaに変換しました。同じこと:「間違った答え」。
Javaのプログラミング課題submissionsのテンプレートを使用していますが、私のアルゴリズムが正しいことを誓うことができました。私が考えることのできる唯一の問題は、入力を読み込んだり、出力を書き込んだりすることです。それを把握していない。ここで私のコードは、どんな助けも大いに評価されるでしょう:
class myStuff implements Runnable {
@Override
public void run() {
String line = Main.ReadLn(128);
while (line != null) {
process(line);
line = Main.ReadLn(128);
}
}
private void process(String line) {
String[] data = line.split("\\s+");
if (data.length == 2) {
int low = Integer.parseInt(data[0]);
int high = Integer.parseInt(data[1]);
int max = low < high ? findMax(low, high) : findMax(high, low);
System.out.println(low + " " + high + " " + max);
}
}
private int findMax(int low, int high) {
int max = Integer.MIN_VALUE;
for (int i = low; i <= high; i++) {
int length = cycleLength(i);
if (length > max)
max = length;
}
return max;
}
private int cycleLength(int i) {
long n = i;
int length = 1;
while (n > 1) {
n = ((n & 1) == 0) ? n >> 1 : 3*n + 1;
length++;
}
return length;
}
}
// java program model from www.programming-challenges.com
class Main implements Runnable {
static String ReadLn(int maxLength) { // utility function to read from
// stdin, Provided by Programming-challenges, edit for style only
byte line[] = new byte[maxLength];
int length = 0;
int input = -1;
try {
while (length < maxLength) { // Read untill maxlength
input = System.in.read();
if ((input < 0) || (input == '\n'))
break; // or untill end of line ninput
line[length++] += input;
}
if ((input < 0) && (length == 0))
return null; // eof
return new String(line, 0, length);
} catch (java.io.IOException e) {
return null;
}
}
public static void main(String args[]) { // entry point from OS
Main myWork = new Main(); // Construct the bootloader
myWork.run(); // execute
}
@Override
public void run() {
new myStuff().run();
}
}
サンプルデータに対して自分でプログラムを実行できますか?正しい答えが出ますか? – btilly
はい、正しくフォーマットされた入力で正常に動作します。それは問題でした、私は入力が適切にフォーマットされていると仮定してはいけませんでした。防御的なスタイルのプログラム –