Dado un número de punto flotante en forma de string N , la tarea es convertir el número de punto flotante dado en fracciones .
La secuencia de dígitos encerrada en “()” en la representación de coma flotante expresa recurrencia en la representación decimal.
Por ejemplo, 1.(6) representa 1.666….
Ejemplos:
Entrada: N = “1,5”
Salida: 3/2
Explicación:
El valor de 3/2 será igual a 1,5Entrada: N = “1.(6)”
Salida: 5 / 3
Explicación:
El valor de 5 / 3 será igual a 1.666… que se representa como 1.(6).
Planteamiento: La idea es usar el Máximo Común Divisor de dos números y algunas ecuaciones matemáticas para resolver el problema. Siga los pasos a continuación para resolver el problema:
- Deje que haya x números después del decimal excepto por la secuencia recurrente.
- Si no hay una secuencia recurrente, multiplique el número dado con 10 x y deje que el GCD de 10 x y el número resultante sean g . Imprime el resultado dividido por g como numerador y 10 x dividido por g como denominador.
Por ejemplo, si N = “1,5” , entonces x = 1 .
Multiplicando N por 10 , la resultante será 15 y el MCD de 10 y 15 es 3 .
Por lo tanto, imprima 15/3 = 5 como numerador y 10/5 como denominador.
- Si la secuencia de recurrencia está presente, multiplique N con 10 x . Por ejemplo, si N = 23.98(231) multiplíquelo con N*(10 2 ) .
- Sea y el número total de dígitos en una secuencia . Para 10 2 *N = 2398.(231) , y se convierte en 3 .
- Multiplica 10 y con N*10 x . Para 10 2 *N = 2398.(231) , multiplíquelo con 10 3 es decir, 10 2 *N*10 3 = 2398231.(231) .
- Ahora, resta, N*10 y+x con N*10 x y deja que el resultado sea M . Para el ejemplo anterior, 10 2 *N*(10 3 -1) = 2395833 .
- Por lo tanto, N = M / ((10 x )*(10 y – 1)) . Para el ejemplo anterior, N = 2395833/999000 .
- Encuentre el MCD de M y ((10 x )*(10 y – 1)) e imprima M / mcd como numerador y ((10 x )*(10 y – 1)) como denominador.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to convert the floating // values into fraction void findFraction(string s) { // Initialize variables string be_deci = "", af_deci = "", reccu = ""; bool x = true, y = false, z = false; // Traverse the floating string for (int i = 0; i < s.size(); ++i) { // Check if decimal part exist if (s[i] == '.') { x = false; y = true; continue; } // Check if recurrence // sequence exist if (s[i] == '(') { z = true; y = false; continue; } // Retrieve decimal part // and recurrence re sequence if (x) be_deci += s[i]; if (y) af_deci += s[i]; if (z) { // Traverse the string for (; i < s.size() && s[i] != ')'; ++i) reccu += s[i]; break; } } // Convert string to integer int num_be_deci = stoi(be_deci); int num_af_deci = 0; // If no recurrence sequence exist if (af_deci.size() != 0) num_af_deci = stoi(af_deci); // Initialize numerator & denominator int numr = num_be_deci * pow(10, af_deci.size()) + num_af_deci; int deno = pow(10, af_deci.size()); // No recurring term if (reccu.size() == 0) { int gd = __gcd(numr, deno); // Print the result cout << numr / gd << " / " << deno / gd; } // If recurring term exist else { // Convert recurring term to integer int reccu_num = stoi(reccu); // reccu.size() is num of // digit in reccur term int numr1 = numr * pow(10, reccu.size()) + reccu_num; int deno1 = deno * pow(10, reccu.size()); // eq 2 - eq 1 int res_numr = numr1 - numr, res_deno = deno1 - deno; int gd = __gcd(res_numr, res_deno); // Print the result cout << res_numr / gd << " / " << res_deno / gd; } } // Driver Code int main() { // Given string str string str = "23.98(231)"; // Function Call findFraction(str); return 0; }
Java
// Java program for the above approach import java.util.*; class GFG{ // Recursive function to return // gcd of a and b static int __gcd(int a, int b) { return b == 0 ? a : __gcd(b, a % b); } // Function to convert the floating // values into fraction static void findFraction(String s) { // Initialize variables String be_deci = "", af_deci = "", reccu = ""; boolean x = true, y = false, z = false; // Traverse the floating String for(int i = 0; i < s.length(); ++i) { // Check if decimal part exist if (s.charAt(i) == '.') { x = false; y = true; continue; } // Check if recurrence // sequence exist if (s.charAt(i) == '(') { z = true; y = false; continue; } // Retrieve decimal part // and recurrence resquence if (x) be_deci += s.charAt(i); if (y) af_deci += s.charAt(i); if (z) { // Traverse the String for(; i < s.length() && s.charAt(i) != ')'; ++i) reccu += s.charAt(i); break; } } // Convert String to integer int num_be_deci = Integer.valueOf(be_deci); int num_af_deci = 0; // If no recurrence sequence exist if (af_deci.length() != 0) num_af_deci = Integer.valueOf(af_deci); // Initialize numerator & denominator int numr = num_be_deci * (int)Math.pow(10, af_deci.length()) + num_af_deci; int deno = (int)Math.pow(10, af_deci.length()); // No recurring term if (reccu.length() == 0) { int gd = __gcd(numr, deno); // Print the result System.out.print(numr / gd + " / " + deno / gd); } // If recurring term exist else { // Convert recurring term to integer int reccu_num = Integer.valueOf(reccu); // reccu.size() is num of // digit in reccur term int numr1 = numr * (int)Math.pow(10, reccu.length()) + reccu_num; int deno1 = deno * (int) Math.pow( 10, reccu.length()); // eq 2 - eq 1 int res_numr = numr1 - numr, res_deno = deno1 - deno; int gd = __gcd(res_numr, res_deno); // Print the result System.out.print(res_numr / gd + " / " + res_deno / gd); } } // Driver Code public static void main(String[] args) { // Given String str String str = "23.98(231)"; // Function Call findFraction(str); } } // This code is contributed by Amit Katiyar
Python3
# Python3 program for the above approach from math import gcd # Function to convert the floating # values into fraction def findFraction(s): # Initialize variables be_deci = "" af_deci = "" reccu = "" x = True y = False z = False # Traverse the floating string for i in range(len(s)): # Check if decimal part exist if (s[i] == '.'): x = False y = True continue # Check if recurrence # sequence exist if (s[i] == '('): z = True y = False continue # Retrieve decimal part # and recurrence resquence if (x): be_deci += s[i] if (y): af_deci += s[i] if (z): # Traverse the string while i < len(s) and s[i] != ')': reccu += s[i] i += 1 break # Convert to integer num_be_deci = int(be_deci) num_af_deci = 0 # If no recurrence sequence exist if len(af_deci) != 0: num_af_deci = int(af_deci) # Initialize numerator & denominator numr = (num_be_deci * pow(10, len(af_deci)) + num_af_deci) deno = pow(10, len(af_deci)) # No recurring term if len(reccu) == 0: gd = gcd(numr, deno) # Print the result print(numr // gd, "/", deno // gd) # If recurring term exist else: # Convert recurring term to integer reccu_num = int(reccu) # reccu.size() is num of # digit in reccur term numr1 = (numr * pow(10, len(reccu)) + reccu_num) deno1 = deno * pow(10, len(reccu)) # eq 2 - eq 1 res_numr = numr1 - numr res_deno = deno1 - deno gd = gcd(res_numr, res_deno) # Print the result print(res_numr // gd, " / ", res_deno // gd) # Driver Code if __name__ == '__main__': # Given str str = "23.98(231)" # Function Call findFraction(str) # This code is contributed by mohit kumar 29
C#
// C# program for the above approach using System; class GFG{ // Recursive function to return // gcd of a and b static int __gcd(int a, int b) { return b == 0 ? a : __gcd(b, a % b); } // Function to convert the floating // values into fraction static void findFraction(String s) { // Initialize variables String be_deci = "", af_deci = "", reccu = ""; bool x = true, y = false, z = false; // Traverse the floating String for(int i = 0; i < s.Length; ++i) { // Check if decimal part exist if (s[i] == '.') { x = false; y = true; continue; } // Check if recurrence // sequence exist if (s[i] == '(') { z = true; y = false; continue; } // Retrieve decimal part // and recurrence resquence if (x) be_deci += s[i]; if (y) af_deci += s[i]; if (z) { // Traverse the String for(; i < s.Length && s[i] != ')'; ++i) reccu += s[i]; break; } } // Convert String to integer int num_be_deci = Int32.Parse(be_deci); int num_af_deci = 0; // If no recurrence sequence exist if (af_deci.Length != 0) num_af_deci = Int32.Parse(af_deci); // Initialize numerator & denominator int numr = num_be_deci * (int)Math.Pow(10, af_deci.Length) + num_af_deci; int deno = (int)Math.Pow(10, af_deci.Length); // No recurring term if (reccu.Length == 0) { int gd = __gcd(numr, deno); // Print the result Console.Write(numr / gd + " / " + deno / gd); } // If recurring term exist else { // Convert recurring term to integer int reccu_num = Int32.Parse(reccu); // reccu.Count is num of // digit in reccur term int numr1 = numr * (int)Math.Pow(10, reccu.Length) + reccu_num; int deno1 = deno * (int)Math.Pow( 10, reccu.Length); // eq 2 - eq 1 int res_numr = numr1 - numr, res_deno = deno1 - deno; int gd = __gcd(res_numr, res_deno); // Print the result Console.Write(res_numr / gd + " / " + res_deno / gd); } } // Driver Code public static void Main(String[] args) { // Given String str String str = "23.98(231)"; // Function Call findFraction(str); } } // This code is contributed by Amit Katiyar
Javascript
<script> // Javascript program for the above approach // Recursive function to return // gcd of a and b function __gcd(a,b) { return b == 0 ? a : __gcd(b, a % b); } // Function to convert the floating // values into fraction function findFraction(s) { // Initialize variables let be_deci = "", af_deci = "", reccu = ""; let x = true, y = false, z = false; // Traverse the floating String for(let i = 0; i < s.length; ++i) { // Check if decimal part exist if (s[i] == '.') { x = false; y = true; continue; } // Check if recurrence // sequence exist if (s[i] == '(') { z = true; y = false; continue; } // Retrieve decimal part // and recurrence resquence if (x) be_deci += s[i]; if (y) af_deci += s[i]; if (z) { // Traverse the String for(; i < s.length && s[i] != ')'; ++i) reccu += s[i]; break; } } // Convert String to integer let num_be_deci = parseInt(be_deci); let num_af_deci = 0; // If no recurrence sequence exist if (af_deci.length != 0) num_af_deci = parseInt(af_deci); // Initialize numerator & denominator let numr = num_be_deci * Math.pow(10, af_deci.length) + num_af_deci; let deno = Math.pow(10, af_deci.length); // No recurring term if (reccu.length == 0) { let gd = __gcd(numr, deno); // Print the result document.write(numr / gd + " / " + deno / gd); } // If recurring term exist else { // Convert recurring term to integer let reccu_num = parseInt(reccu); // reccu.size() is num of // digit in reccur term let numr1 = numr * Math.pow(10, reccu.length) + reccu_num; let deno1 = deno * Math.pow( 10, reccu.length); // eq 2 - eq 1 let res_numr = numr1 - numr, res_deno = deno1 - deno; let gd = __gcd(res_numr, res_deno); // Print the result document.write(res_numr / gd + " / " + res_deno / gd); } } // Driver Code // Given String str let str = "23.98(231)"; // Function Call findFraction(str); // This code is contributed by unknown2108 </script>
798611 / 33300
Complejidad de tiempo: O(log 10 N)
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por rakeshsahni y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA