我在“编程挑战”book中运行“3n + 1问题”时遇到了问题。
我已经尝试过我在谷歌上找到的所有Java解决方案(甚至是Stack Overflow上的解决方案),而且没有一个可以工作,它们都会报告“错误答案”。我还发现了一个有效的C ++解决方案,将其翻译成Java,同样的事情:“错误的答案”。
我正在使用Programming Challenges for 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();
}
}
答案 0 :(得分:6)
解决。好的,对于初学者来说,网站http://programming-challenges.com现在肯定不能用于Java提交(他们现在正在进行某种服务器迁移)。我尝试了备用网站http://uva.onlinejudge.org;那个正在正确处理Java提交。
但无论如何,我上面的代码中有一个错误 - 这行修复了它:
String[] data = line.trim().split("\\s+");
输入数据总是很乱 - 额外的空格,空行等等,任何试图解析输入的人都应该这样做。
答案 1 :(得分:0)
首页&gt;在线评判&gt;提交规格
此链接可能会有所帮助
读取输入的示例代码来自:http://online-judge.uva.es/problemset/data/p100.java.html
这是stackoverflow的另一个链接:https://stackoverflow.com/a/14632770/1060656
我认为在UVA判断中最重要的是1)得到输出完全相同,最后没有额外的线。 2)我假设,永远不会抛出异常只是返回或中断没有输出外部边界参数。 3)输出区分大小写4)输出参数应保持空间,如问题
所示