2 つの数値のうち 1 つが非常に大きくなる場合の 2 つの数値の GCD

(0 <= a <= 10^12 and b <= b < 10^250). Find the GCD of two given numbers.
例:  
 

Input: a = 978 b = 89798763754892653453379597352537489494736 Output: 6 Input: a = 1221 b = 1234567891011121314151617181920212223242526272829 Output: 3 


 


解決 : 与えられた問題では、最初の数値 'a' は long long int データ型で処理できますが、2 番目の数値 'b' はどの int データ型でも処理できないことがわかります。ここでは 2 番目の数値を文字列として読み取り、それを 'a' で剰余して 'a' 以下にしようとします。
以下は上記のアイデアを実装したものです。 
 

C++
   // C++ program to find GCD of two numbers such that   // the second number can be very large.   #include       using     namespace     std  ;   typedef     long     long     int     ll  ;   // function to find gcd of two integer numbers   ll     gcd  (  ll     a       ll     b  )   {      if     (  !  a  )      return     b  ;      return     gcd  (  b     %     a       a  );   }   // Here 'a' is integer and 'b' is string.   // The idea is to make the second number (represented   // as b) less than and equal to first number by   // calculating its mod with first integer number   // using basic mathematics   ll     reduceB  (  ll     a       char     b  [])   {      // Initialize result      ll     mod     =     0  ;      // calculating mod of b with a to make      // b like 0  <= b  < a      for     (  int     i     =     0  ;     i      <     strlen  (  b  );     i  ++  )      mod     =     (  mod     *     10     +     b  [  i  ]     -     '0'  )     %     a  ;      return     mod  ;     // return modulo   }   // This function returns GCD of 'a' and 'b'   // where b can be very large and is represented   // as a character array or string   ll     gcdLarge  (  ll     a       char     b  [])   {      // Reduce 'b' (second number) after modulo with a      ll     num     =     reduceB  (  a       b  );      // gcd of two numbers      return     gcd  (  a       num  );   }   // Driver program   int     main  ()   {      // first number which is integer      ll     a     =     1221  ;      // second number is represented as string because      // it can not be handled by integer data type      char     b  []     =     '1234567891011121314151617181920212223242526272829'  ;      if     (  a     ==     0  )      cout      < <     b      < <     endl  ;      else      cout      < <     gcdLarge  (  a       b  )      < <     endl  ;      return     0  ;   }   
Java
   // Java program to find    // GCD of two numbers    // such that the second    // number can be very large.   class   GFG      {      // This function computes       // the gcd of 2 numbers      private     static     int     gcd  (  int     reduceNum       int     b  )      {      return     b     ==     0     ?         reduceNum     :     gcd  (  b       reduceNum     %     b  );      }      // Here 'a' is integer and 'b'      // is string. The idea is to make      // the second number (represented       // as b) less than and equal to       // first number by calculating its       // modulus with first integer       // number using basic mathematics      private     static     int     reduceB  (  int     a       String     b  )         {      int     result     =     0  ;      for     (  int     i     =     0  ;     i      <     b  .  length  ();     i  ++  )         {      result     =     (  result     *     10     +      b  .  charAt  (  i  )     -     '0'  )     %     a  ;      }      return     result  ;      }      private     static     int     gcdLarge  (  int     a       String     b  )         {      // Reduce 'b' i.e the second       // number after modulo with a      int     num     =     reduceB  (  a       b  );          // Nowuse the euclid's algorithm       // to find the gcd of the 2 numbers      return     gcd  (  num       a  );      }      // Driver code      public     static     void     main  (  String  []     args  )         {      // First Number which      // is the integer      int     a     =     1221  ;          // Second Number is represented       // as a string because it cannot       // be represented as an integer      // data type      String     b     =     '19837658191095787329'  ;      if     (  a     ==     0  )      System  .  out  .  println  (  b  );      else      System  .  out  .  println  (  gcdLarge  (  a       b  ));      }   // This code is contributed   // by Tanishq Saluja.   }   
Python3
   # Python3 program to find GCD of    # two numbers such that the second   # number can be very large.   # Function to find gcd   # of two integer numbers   def   gcd  (  a     b  )   :   if   (  a   ==   0  )   :   return   b   return   gcd  (  b   %   a     a  )   # Here 'a' is integer and 'b' is string.   # The idea is to make the second number   # (represented as b) less than and equal   # to first number by calculating its mod   # with first integer number using basic   # mathematics   def   reduceB  (  a     b  )   :   # Initialize result   mod   =   0   # Calculating mod of b with a    # to make b like 0  <= b  < a   for   i   in   range  (  0     len  (  b  ))   :   mod   =   (  mod   *   10   +   ord  (  b  [  i  ]))   %   a   return   mod   # return modulo   # This function returns GCD of   # 'a' and 'b' where b can be   # very large and is represented   # as a character array or string   def   gcdLarge  (  a     b  )   :   # Reduce 'b' (second number)   # after modulo with a   num   =   reduceB  (  a     b  )   # gcd of two numbers   return   gcd  (  a     num  )   # Driver program   # First number which is integer   a   =   1221   # Second number is represented   # as string because it can not   # be handled by integer data type   b   =   '1234567891011121314151617181920212223242526272829'   if   a   ==   0  :   print  (  b  )   else  :   print  (  gcdLarge  (  a     b  ))   # This code is contributed by Nikita Tiwari.   
C#
   // C# program to find GCD of    // two numbers such that the   // second number can be very large.   using     System  ;   class     GFG   {   // function to find gcd   // of two integer numbers   public     long     gcd  (  long     a       long     b  )   {      if     (  a     ==     0  )      return     b  ;      return     gcd  (  b     %     a       a  );   }   // Here 'a' is integer and   // 'b' is string. The idea    // is to make the second    // number (represented as b)   // less than and equal to    // first number by calculating    // its mod with first integer    // number using basic mathematics   public     long     reduceB  (  long     a       string     b  )   {      // Initialize result      long     mod     =     0  ;      // calculating mod of       // b with a to make      // b like 0  <= b  < a      for     (  int     i     =     0  ;     i      <     b  .  Length  ;     i  ++  )      mod     =     (  mod     *     10     +         (  b  [  i  ]     -     '0'  ))     %     a  ;      return     mod  ;      }   // This function returns GCD    // of 'a' and 'b' where b can   // be very large and is    // represented as a character   // array or string   public     long     gcdLarge  (  long     a       string     b  )   {      // Reduce 'b' (second number)      // after modulo with a      long     num     =     reduceB  (  a       b  );      // gcd of two numbers      return     gcd  (  a       num  );   }   // Driver Code   static     void     Main  ()   {      // first number       // which is integer      long     a     =     1221  ;      // second number is represented       // as string because it can not      // be handled by integer data type      string     b     =     '1234567891011121314151617181920212223242526272829'  ;      GFG     p     =     new     GFG  ();      if     (  a     ==     0  )      Console  .  WriteLine  (  b  );      else      Console  .  WriteLine  (  p  .  gcdLarge  (  a       b  ));   }   }   // This code is contributed by mits.    
PHP
      // PHP program to find GCD of   // two numbers such that the    // second number can be very large.   // function to find gcd of   // two integer numbers   function   gcd  (  $a     $b  )   {   if   (  !  $a  )   return   $b  ;   return   gcd  (  $b   %   $a     $a  );   }   // Here 'a' is integer and 'b'    // is string. The idea is to    // make the second number    // (represented as b) less than    // and equal to first number by   // calculating its mod with first   // integer number using basic mathematics   function   reduceB  (  $a     $b  )   {   // Initialize result   $mod   =   0  ;   // calculating mod of b with   // a to make b like 0  <= b  < a   for   (  $i   =   0  ;   $i    <   strlen  (  $b  );   $i  ++  )   $mod   =   (  $mod   *   10   +   $b  [  $i  ]   -   '0'  )   %   $a  ;   // return modulo   return   $mod  ;   }   // This function returns GCD of    // 'a' and 'b' where b can be    // very large and is represented   // as a character array or string   function   gcdLarge  (  $a     $b  )   {   // Reduce 'b' (second number)   // after modulo with a   $num   =   reduceB  (  $a     $b  );   // gcd of two numbers   return   gcd  (  $a     $num  );   }   // Driver Code   // first number which is integer   $a   =   1221  ;   // second number is represented    // as string because it can not   // be handled by integer data type   $b   =   '1234567891011121314151617181920212223242526272829'  ;   if   (  $a   ==   0  )   {   echo  (  $b  );   }   else   {   echo   gcdLarge  (  $a     $b  );   }   // This code is contributed by nitin mittal.    ?>   
JavaScript
    <  script  >   // JavaScript program to find GCD of two numbers such that   // the second number can be very large.   // function to find gcd of two integer numbers   function     gcd  (     a       b  )   {      if     (  !  a  )      return     b  ;      return     gcd  (  b  %  a    a  );   }   // Here 'a' is integer and 'b' is string.   // The idea is to make the second number (represented   // as b) less than and equal to first number by   // calculating its mod with first integer number   // using basic mathematics   function     reduceB  (     a       b  )   {      // Initialize result      let     mod     =     0  ;      // calculating mod of b with a to make      // b like 0  <= b  < a      for     (  let     i  =  0  ;     i   <  b  .  length  -  1  ;     i  ++  )      mod     =     (  mod  *  10     +     b  [  i  ]     -     '0'  )  %  a  ;      return     mod  ;     // return modulo   }   // This function returns GCD of 'a' and 'b'   // where b can be very large and is represented   // as a character array or string   function     gcdLarge  (     a       b  )   {      // Reduce 'b' (second number) after modulo with a      let     num     =     reduceB  (  a       b  );      // gcd of two numbers      return     gcd  (  a       num  );   }   // Driver program      // first number which is integer      let     a     =     1221  ;      // second number is represented as string because      // it can not be handled by integer data type      let     b     =     '1234567891011121314151617181920212223242526272829'  ;      if     (  a     ==     0  )      document  .  write  (     b  );      else      document  .  write  (  gcdLarge  (  a       b  ));   // This code contributed by aashish1995     <  /script>   

出力
3 

時間計算量: O(log (min(ab))) 
補助スペース: O(log (min(ab))) 


この記事は GeeksforGeeks チームによってレビューされています。