为什么我的程序永远不会达到求解方法?

时间:2011-05-13 15:58:57

标签: java inputstream

抱歉,如果这是一个愚蠢的问题,但我是初学者使用StreamTokenizer,我正在尝试解决这个练习this,请帮助我,我不知道我的程序中有什么错误,从来没有达到我的解决方法,它也永远不会完成,我已经在timus论坛上问过,但我知道这里收到答案的速度更快

import java.io.*;

public class Prueba {
    static int index = 0;
    static double[] l = new double[131072];

    public static void main(String args[]) throws IOException {
        StreamTokenizer str = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        while (((str.nextToken() != StreamTokenizer.TT_EOF))) {
            if (str.ttype == StreamTokenizer.TT_NUMBER) {
                l[index++] = str.nval;
                //System.out.println(str.nval);
                // System.out.println(l[0]);
                // System.out.println(l[1]);
            }
        }
        solve();
    }

    public static void solve() {
        double res;
        for (int i = index - 1; i >= 0; i--) {
            res = Math.sqrt(l[i]);
            System.out.println(String.format("%.4f\n", res));
        }
    }
}

3 个答案:

答案 0 :(得分:4)

您正在阅读标准输入,并且您的代码会循环,直到获得TT_EOF。要将TT_EOF提供给您的计划,如果您使用的是Unix,则需要按Ctrl-D;如果您使用的是Windows,则需要Ctrl-Z后跟Enter

答案 1 :(得分:3)

你正在等待System.in,它在读取时阻塞,ergo,你永远不会得到EOF所以你循环将继续等待输入。

答案 2 :(得分:1)

实际上,您需要从命令行管道传输文件,或者在控制台上输入文本,然后输入EOF字符。按Ctrl + Z在Windows中生成EOF,按Ctrl + D在Unix / Linux中生成EOF。

编辑:如果您的输入是单行,则可以检查TT_EOL而不是TT_EOF。 在进入循环之前,您必须致电eolIsSignificant(true)。这将确保行尾被视为单独的令牌