📌  相关文章
📜  比较以科学记数法给出的两个浮点数

📅  最后修改于: 2022-05-13 01:56:06.112000             🧑  作者: Mango

比较以科学记数法给出的两个浮点数

给定两个字符串NM ,形式为a * 10 b 。任务是比较给定的两个浮点数并打印较小的数字,如果两个数字相等,则打印 Equal。

例子:

朴素方法:我们将计算从字符串N 和 M 中提取的数字的值,然后比较哪个更好。 bigInteger 类将用于在Java中存储和计算 N 和 M 的值。对于较大的测试用例,这种方法可能会产生 Time Limit Exceeded 错误。

最佳方法:

  • 从字符串N 和 M 中提取尾数和指数。
  • 找到 '*' 的索引(比如说mulInd),然后 mulInd 之前的子字符串将是尾数(a1)。
  • 找到 '^' 的索引,比如说powInd ,然后 powInd 之后的子字符串将是指数(b1)。
  • 同样,找出 a2 和 b2。
  • if(a1 > 0 && a2 < 0) ,打印M ( M 总是更小)。
  • 同样,如果 (a2 > 0 && a1 < 0) ,则打印N
  • 否则将需要使用日志进行比较。
  • 以下公式将用于计算对数并得出一个结果,该结果将进行比较以确定哪个数字更大。
  • 如果 a1 < 0 ,则ans = -ans 。这是因为 a1 和 a2 都是负数。
    • 如果ans < 0 ,打印N
    • 否则,如果ans > 0 ,则打印M
  • 否则打印相等。

下面是实现上述方法的 Jave 程序:

Java
// Java program to implement
// the above approach
import java.io.*;
import java.util.*;
import java.math.*;
import java.lang.*;
 
class GFG
{
  // Function to extract mantissa
  static int[] extract_mantissa(String N,
                                String M)
  {
    int mantissa[] = new int [2];
    int mulInd1 = N.indexOf('*');
    int a1 = Integer.parseInt(
             N.substring(0, mulInd1));
    mantissa[0] = a1;
              
    int mulInd2 = M.indexOf('*');
    int a2 = Integer.parseInt(
             M.substring(0, mulInd2));
    mantissa[1] = a2;
    return mantissa;
  }
   
  // Function to extract exponent
  static int[] extract_exponent(String N,
                                String M)
  {
    int exponent[] = new int [2];
    int powInd1 = N.indexOf('^');
    int b1 = Integer.parseInt(
             N.substring(powInd1 + 1));
    exponent[0] = b1;
              
    int powInd2 = M.indexOf('^');        
    int b2 = Integer.parseInt(
             M.substring(powInd2 + 1));
    exponent[1] = b2;
    return exponent;
  }
   
  // Function to find smaller number
  static void solution(int a1, int b1,
                       int a2, int b2)
  { 
    double x = ((double)(a1) /
                (double)(a2));
    double ans = (b1 - b2 +
                  Math.log10(x));
     
    // If both are negative
    if(a1 < 0)
      ans = -ans;
    if(ans < 0)
      System.out.println("N");
    else if(ans > 0)
      System.out.println("M");
    else
      System.out.println("Equal");
  }
   
  static void solve(String N, String M)
  {
    // Extract mantissa(a1) and mantissa(a2)
    // from num1 and num2
    int mantissa[] = extract_mantissa(N, M);
 
    // Extract exponent(b1) and exponent(b2)
    // from num1 and num2
    int exponent[] = extract_exponent(N, M);
 
    if(mantissa[0] > 0 && mantissa[1] < 0)
      System.out.println("M");
    else if(mantissa[0] < 0 && mantissa[1] > 0)
      System.out.println("N");
    else
    {
      // if mantissa of both num1 and num2
      // are positive or both are negative
      solution(mantissa[0], exponent[0],
               mantissa[1], exponent[1]);
    }
  }
   
  // Driver code
  public static void main (String[] args)
  {
    // Mantissa is negative and
    // exponent is positive
    String N = "-5*10^3";
    String M = "-50*10^2";
    solve(N, M);
     
    // Mantissa is negative and
    // exponent is negative
    N = "-5*10^-3";
    M = "-50*10^-2";
    solve(N, M);
 
    // Mantissa is positive and
    // exponent is negative
    N = "5*10^-3";
    M = "50*10^-2";
    solve(N, M);
     
    // Mantissa is positive and
    // exponent is positive
    N = "5*10^3";
    M = "50*10^2";
    solve(N, M);
  }
}


Python3
# Python 3 program to implement
# the above approach
import math
 
# Function to extract mantissa
def extract_mantissa(N,  M):
 
    mantissa = [0]*2
    mulInd1 = list(N).index('*')
    a1 = N[0: mulInd1]
    mantissa[0] = a1
 
    mulInd2 = list(M).index('*')
    a2 = M[0: mulInd2]
    mantissa[1] = a2
    return mantissa
 
# Function to extract exponent
def extract_exponent(N,  M):
 
    exponent = [0]*2
    powInd1 = list(N).index('^')
    b1 = N[powInd1 + 1:]
    exponent[0] = b1
 
    powInd2 = list(M).index('^')
    b2 = M[powInd2 + 1:]
    exponent[1] = b2
    return exponent
 
# Function to find smaller number
def solution(a1,  b1,
             a2,  b2):
 
    x = int(a1) / int(a2)
    ans = (int(b1) - int(b2) + math.log10(x))
 
    # If both are negative
    if(int(a1) < 0):
        ans = -ans
    if(ans < 0):
        print("N")
    elif(ans > 0):
        print("M")
    else:
        print("Equal")
 
def solve(N,  M):
 
    # Extract mantissa(a1) and mantissa(a2)
    # from num1 and num2
    mantissa = extract_mantissa(N, M)
 
    # Extract exponent(b1) and exponent(b2)
    # from num1 and num2
    exponent = extract_exponent(N, M)
 
    if(int(mantissa[0]) > 0 and int(mantissa[1]) < 0):
        print("M")
    elif(int(mantissa[0]) < 0 and int(mantissa[1]) > 0):
        print("N")
    else:
 
        # if mantissa of both num1 and num2
        # are positive or both are negative
        solution(mantissa[0], exponent[0],
                 mantissa[1], exponent[1])
 
# Driver code
if __name__ == "__main__":
 
    # Mantissa is negative and
    # exponent is positive
    N = "-5*10^3"
    M = "-50*10^2"
    solve(N, M)
 
    # Mantissa is negative and
    # exponent is negative
    N = "-5*10^-3"
    M = "-50*10^-2"
    solve(N, M)
 
    # Mantissa is positive and
    # exponent is negative
    N = "5*10^-3"
    M = "50*10^-2"
    solve(N, M)
 
    # Mantissa is positive and
    # exponent is positive
    N = "5*10^3"
    M = "50*10^2"
    solve(N, M)
 
    # This code is contributed by ukasp.


C#
// C# program to implement
// the above approach
using System;
 
class GFG
{
  // Function to extract mantissa
  public static int[] extract_mantissa(String N, String M)
  {
    int[] mantissa = new int [2];
    int mulInd1 = N.IndexOf('*');
    int a1 = int.Parse(N.Substring(0, mulInd1));
    mantissa[0] = a1;
              
    int mulInd2 = M.IndexOf('*');
    int a2 = int.Parse(M.Substring(0, mulInd2));
    mantissa[1] = a2;
    return mantissa;
  }
   
  // Function to extract exponent
  public static int[] extract_exponent(String N,  String M)
  {
    int[] exponent = new int [2];
    int powInd1 = N.IndexOf('^');
    int b1 = int.Parse(N.Substring(powInd1 + 1));
    exponent[0] = b1;
              
    int powInd2 = M.IndexOf('^');        
    int b2 = int.Parse(
             M.Substring(powInd2 + 1));
    exponent[1] = b2;
    return exponent;
  }
   
  // Function to find smaller number
  static void solution(int a1, int b1,
                       int a2, int b2)
  { 
    double x = ((double)(a1) /
                (double)(a2));
    double ans = (b1 - b2 +
                  Math.Log10(x));
     
    // If both are negative
    if(a1 < 0)
      ans = -ans;
    if(ans < 0)
      Console.WriteLine("N");
    else if(ans > 0)
      Console.WriteLine("M");
    else
      Console.WriteLine("Equal");
  }
   
  static void solve(String N, String M)
  {
    // Extract mantissa(a1) and mantissa(a2)
    // from num1 and num2
    int[] mantissa = extract_mantissa(N, M);
 
    // Extract exponent(b1) and exponent(b2)
    // from num1 and num2
    int[] exponent = extract_exponent(N, M);
 
    if(mantissa[0] > 0 && mantissa[1] < 0)
      Console.WriteLine("M");
    else if(mantissa[0] < 0 && mantissa[1] > 0)
      Console.WriteLine("N");
    else
    {
      // if mantissa of both num1 and num2
      // are positive or both are negative
      solution(mantissa[0], exponent[0],
               mantissa[1], exponent[1]);
    }
  }
   
  // Driver code
  public static void Main ()
  {
    // Mantissa is negative and
    // exponent is positive
    String N = "-5*10^3";
    String M = "-50*10^2";
    solve(N, M);
     
    // Mantissa is negative and
    // exponent is negative
    N = "-5*10^-3";
    M = "-50*10^-2";
    solve(N, M);
 
    // Mantissa is positive and
    // exponent is negative
    N = "5*10^-3";
    M = "50*10^-2";
    solve(N, M);
     
    // Mantissa is positive and
    // exponent is positive
    N = "5*10^3";
    M = "50*10^2";
    solve(N, M);
  }
}
 
// This code is contributed by saurabh_jaiswal.


输出:

时间复杂度: O ( 1 )
根据给定的约束 |a|最多可以是 10 个长度的字符串,如果它是负数,那么它可以是 11 个长度,同样 b 也可以是 11 个数字。字符串的最大长度可以是25(11+3+11),所以我们可以考虑提取a和b的常数时间运算。

辅助空间: O(1)