【问题标题】:Compare two large numbers比较两个大数
【发布时间】:2014-10-17 05:18:42
【问题描述】:

已经提供了代表两个数字的两个字符串作为输入。字符串中的数字可能很大,以至于它们可能无法用 Java 数据类型 int 表示。目标是比较两个数字并将该数字输出为字符串

例如我们必须比较:

“874986754789289867753896798679854698798789857387687546456”

和

“98347598375689758967756458678976893478967586857687569874”

它们都超出了 JAVA 中的 long 和 int 数据类型的范围 在比较之后,我们必须将该数字输出为字符串

【问题讨论】:

  • 您的意思是要减去这两个数字并将差值作为一个数字输出吗?
  • 您必须编写自己的方法还是可以使用内置解决方案?我们还可以看到您解决此问题的尝试吗?
  • @ErstwhileIII 不不,用户会给我们字符串,这实际上是两个数字,但是我们必须比较数字并输出更大的数字 ///
  • @Pshemo 我们也可以编写自己的方法

标签: java compare


【解决方案1】:

如果是学校作业,你不能使用内置解决方案,但你需要编写自己的方法来比较这些字符串,那么你需要

  1. 检查数字的符号(如果一个是负数,一个是正数,那么答案很明显)
  2. 删除前导零 - 0000123 代表 123
  3. 去除前导零后比较数字的长度(正数中越长的数字越大)
  4. 如果两个数字的长度相同,则从左到右遍历它们,直到找到两个不同的数字(如果您找不到任何数字相等)。

你可能需要的String类成员

  • toCharArray()
  • charAt(int index)
  • length

如果您可以使用内置解决方案,您可以使用这些字符串创建BigInteger 实例并使用其compareTo 方法,该方法将判断一个数字是否大于(正结果)等于(0)或更小(阴性结果)比其他的。

【讨论】:

    【解决方案2】:

    仅使用 compareTo() 比较两个字符串就足够了。比较将通过将每个字符转换为其 ASCII 值来完成。

    String number1 = "874986754789289867753896798679854698798789857387687546457";
    String number2 = "874986754789289867753896798679854698798789857387687546456";
    
    int result = number1.compareTo(number2);
    if (result == 0) {
        System.out.println("Both are equal");
    } else if (result > 0) {
        System.out.println("Number1 is greater");
    } else {
        System.out.println("Number2 is greater");
    }
    

    【讨论】:

    • 只有字符串长度相同时才会出现这种情况。
    【解决方案3】:

    为了使用这么大的数字,它们必须声明为双精度数。您可以使用解析器将字符串转换为数字。

    public static void main(String [] args) {
        String numberOne = "874986754789289867753896798679854698798789857387687546456";
        double parsedNumberOne = Double.parseDouble(numberOne);
    
        String numberTwo = "98347598375689758967756458678976893478967586857687569874";
        double parsedNumberTwo = Double.parseDouble(numberTwo);
    
        double result = compareMethod (numberOne, numberTwo);
        System.out.println("Result = " + result);
    }
    

    我明确声明了这些数字,而不是通过读取用户输入,但您可以轻松地对其进行修改,使其与您的代码内联。在 compareMethod 中,您可以随意比较这些数字。

    问候

    【讨论】:

      【解决方案4】:

      不清楚您是尝试比较还是减去,但 Java 的 BigInteger 类具有这两种操作。这可能是您需要的:

      BigInteger a = new BigInteger("874986754789289867753896798679854698798789857387687546456");
      BigInteger b = new BigInteger("98347598375689758967756458678976893478967586857687569874");
      
      System.out.println( (a.compareTo(b) > 0 ? "a" : "b") + " is larger.");
      

      如果您需要减去数字,我肯定会使用BigInteger,但如果您需要做的只是比较它们,您可以编写自己的方法。您的一个输入字符串比另一个长,因此除非前导零会立即告诉您哪个更大。如果字符串的长度相同,您可以在循环中逐个字符地比较它们以查看哪个更大。 String charAt 和 toCharArray 方法为您提供了两种不同的方法来实现此方法。

      【讨论】:

        【解决方案5】:

        您可以先查看每个字符串的长度。如果其中一个较长并且您知道它们都是无符号值,则较长的字符串具有较大的数字。如果它们的长度相同,则从左到右开始逐个字符地比较字符串。当您找到第一个更大的数字时,您会得出结论该数字更大。

        【讨论】:

        • 需要检查前导零。
        【解决方案6】:

        您需要从右到左逐一(或逐组)比较字符(转换为数字)。分别使用charAt(int)或substring(int, int)等方法。

        【讨论】:

        • 其实可以从左到右比较。如果两个数字的长度相同,则第一个较大的数字确定哪个数字更大。 (如果它们的长度不同,且前导零也不同,则数字越长越大。)
        • 使用 BigDecimal 或 BigInteger .. 不要重新实现轮子(可能会出错)
        • @HotLicks 你是对的。我还真没想过。效率更高。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 2012-06-05
        • 1970-01-01
        • 2015-12-02
        • 2017-07-25
        相关资源
        最近更新 更多