【问题标题】:Compare randomly generated number between user input比较用户输入之间随机生成的数字
【发布时间】:2016-03-15 19:08:09
【问题描述】:

我是一名 cs 学生,我有一个作业我不知道如何完成这里是提示,

“开发一个 Java 控制台应用程序,用于猜一个简单的五位数密码游戏(从 10000 到 99999 的随机数)。当用户输入密码时,程序会输出两个值:数字猜中正确位置的位数和这些位数的总和。例如,如果密码是 53840,而用户猜到 83241,则数字 3 和 4 的位置正确。因此,程序应该响应有 2(正确数字的个数)和 7(正确数字的总和)。允许用户猜测,直到他/她猜对为止。"

基本上我坚持的部分是如何找到哪些数字是共同的正确数字并将它们加在一起。到目前为止,这是我的代码。

Random rand = new Random();
    int secretNumber = rand.nextInt(99999 - 10000 + 1) + 10000;
    System.out.println(secretNumber);
    Scanner consoleScanner = new Scanner(System.in);
    int guess;
    do {
        System.out.print("Please enter a 5-digit code (your guess): ");
        guess = consoleScanner.nextInt();
        if (guess == secretNumber)
            System.out.println("****HOORAY!  You solved it.  You are so smart****");
        else if (guess > 99999 || guess < 10000)
            System.out.println("Guess must be a 5-digit code between 10000 and 99999.\n");
    } while (guess != secretNumber);

任何帮助将不胜感激。

【问题讨论】:

    标签: java random


    【解决方案1】:

    你有一个号码。我会称它为布拉格。假设 blarg 是双重的。 您还有一个称为输入的数字。

        String blargString = Double.toString(blarg);
        String inputString = Double.toString(input);
        ArrayList<Integer[]> indexNumberList = new ArrayList<Integer[]>();
        int n = 0;
        for (char c : blargString.toCharArray()) {
            n++;
            if (c == inputString.toCharArray()[n]) {
                Integer[] entry = new Integer[2];
                entry[0] = n;
                entry[1] = Character.getNumericValue(c);
                indexNumberList.add(entry);
            }
       }
    

    现在您有了一个整数对列表。用它做你想做的事。对于每一对,entry[0] 是数字中的位置,索引,entry[1] 是值。

    【讨论】:

    • 现在可以了。而且我认为它确实回答了这个问题,我原始答案的明显(在我看来)内涵是逐个字符地找出答案。正如我在上面的代码中所做的那样。但是,由于您似乎认为隐式帮助不合适,所以我的回答很明确。
    【解决方案2】:

    Integer.toString(int) 返回整数的字符串表示形式。您可以逐个字符比较从Integer.toString(secretNumber)Integer.toString(guess) 返回的字符串,以确定哪些数字不同。

    【讨论】:

    • @SimonKraemer 假设提问者知道如何比较字符串,Integer.toString(int) 正是问题的答案。
    • 西蒙对每个人都进行了投票和否决,我们都在说同样的话,我们没事。逐个字符地遍历数字字符串并比较整数值。这是显而易见的答案,也是每个人都说的答案。我不知道 Simon 认为这里发生了什么。
    • Simon 我认为这里的惯例是我们尽量不要说太多。仅仅说出 thomasd 的所作所为就足以弄清楚其余部分。是的,这有点矫枉过正,但那又怎样?他就像浪费了一个字节的内存一样丢失了。另外,这就是链接器和加载器正在做的事情 - 字符串解析为 char 数组。
    • Simon 你的答案使用了大量的除法,这比转换为 char 数组的计算成本更高。
    • @MaxvonHippel:您认为Integer.toString 的工作原理究竟如何?对:它做的分区和我做的完全一样。但它也将结果转换为它们的字符表示......
    【解决方案3】:

    这就是我解决这个问题的方法。我的解决方案很快,但可能很幼稚。将用户输入的数字和您生成的数字转换为字符串,然后转换为两个每个 5 字节的数组。扫描数组并一次比较两个相应的字节。如果两个对应的字节相等,则让用户知道一个数字的位置被猜对了。下面,我将向您展示如何获取所需的字节数组。

    byte[] a =  Integer.toString(guess).getBytes();
    byte[] b =  Integer.toString(secretNumber).getBytes();
    

    【讨论】:

    • 这绝对是创意加分!但我认为完全没有必要转换为字节,更容易保存为字符甚至是整数数组。与字节之间的转换可能比 char int 更昂贵,并且几乎肯定超出了 OP 可以轻松完成的操作。
    • @MaxvonHippel 我同意。我在飞行中想到了那个解决方案。使用 String 类的 charAt() 方法是更好的解决方案。 Xoce 在他的回答中展示了如何做到这一点。
    【解决方案4】:

    因此,您需要比较 2 个 5 位数字。 我建议您使用循环来执行此操作:

    //Make copies so we can modify the value without changing
    // the original ones.
    int tempGuess = guess;
    int tempSecret = secretNumber;
    
    //Create variables for the output
    int numCorrect = 0;
    int sumCorrect = 0;
    for(int i = 0; i < 5; i++) //for each of the digits
    {
         //Get the last digit of each number and remove it from the number:
         int lastGuess = tempGuess%10;
         tempGuess/=10;
         int lastSecret = tempSecret%10;
         tempSecret/=10;
    
         //Compare both digits:
         if(lastGuess == lastSecret)
         {
             //Found a match: Increas number of found by one
             numCorrect++;
             //Add value of digit to sum
             sumCorrect += lastGuess;
         }
     }
     //numCorrect now contains the number of matching digits
     //sumCorrect now contains the sum of matchig digits
    

    【讨论】:

    • Simon 我认为这是假设输入和密码长度相等,因为您基本上每次都会截断最后一位数字。因此,如果我猜到 CAT 并且这个词是 CATS,那么您的解决方案会说我离我很远。
    • @MaxvonHippel 该条件已由 OP if (guess &gt; 99999 || guess &lt; 10000) 检查。所以没有理由担心这一点。
    【解决方案5】:

    解决方案可以是这样的地址:

    • 为巧合定义一个计数器,为这些巧合定义一个累加器
    • 循环猜测,如果任何给定字符的输入与随机数匹配,则逐字符比较,如果是:
    • 将计数器加一并将字符的整数值添加到累加器中。

    示例:

    final String s1 = Integer.toString(secretNumber);
    final String s2 = Integer.toString(guess);
    for (int i = 0; i < s1.length(); i++) {
        if (s1.charAt(i) == s2.charAt(i)) {
            counter++;
            acumm = Character.getNumericValue(s1.charAt(i));
        }
    }
    System.out.println("There is/are " + counter + " coincidences");
    System.out.println("The addition of those is: " + acumm);
    

    【讨论】:

      【解决方案6】:

      你可以使用整数、模数和除法来得到你想要的数字。

      53840 % 100000 / 10000 = 5
      53840 % 10000 / 1000 = 3

      循环比较

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-10
        相关资源
        最近更新 更多