Función de c# aceptar entero n y devuelva el número más bajo que se puede dividir números 1..n

0

Pregunta

Necesito escribir una función que toma como argumento el número (n) y de retorno (como cadena) el número más bajo disponible que se puede dividir todos los números de 1 a n. ejemplo, si n=4, entonces la función devolverá 12 como 12/4 12/2 12/3 12/1 son números enteros.

he escrito una función para la que funciona bien cuando los números son menores de 19.. por encima de los 19 el tiempo de computación se está volviendo mucho más. alguien puede darme una sugerencia de cómo mejorar el mecanismo de esta función para hacerlo más rápido

 public static string Smallest(int n)
        {
           
            int good = 0;//will hold number of times we got divide with no remianders
            int num = n;//smallest possible number is n
            while (true)
            {
                good = 0;
                for (int i=n; i>=1; i--)
                {
                    if (num % i ==0) good++;//meaning we got zero remainder for the divide
                    if (good == n) return num.ToString();//num of times we got zero remainders == n.

                }
                num++;
            }

        }


algorithm c# math
2021-11-23 18:05:46
3

Mejor respuesta

1

Usted va a tener enormes números grandes n, es por eso que vamos a usar BigInteger para el interior de la computación. Como Abhishek Pandey ponerlo, debemos calcular LCM, el cual puede ser obtenido como

 LCM(a, b) = a * b / GCD(a, b)

donde CGD es el máximo Común Divisor

Código:

using System.Numerics;

...

public static string Smallest(int n) {
  if (n < 1)
    throw new ArgumentOutOfRangeException(nameofn()); 

  BigInteger result = 1;

  for (int i = 1; i <= n; ++i) 
    result = result * i / BigInteger.GreatestCommonDivisor(result, i);

  return result.ToString();
}

Demo:

  using System.Linq;
  using System.Numerics;

  ...

  var demos = string.Join(Environment.NewLine, Enumerable
    .Range(1, 20)
    .Select(n => $"{n,2} : {Smallest(n),20}"));

  Console.WriteLine(demos);
  Console.WriteLine();
  Console.WriteLine(Smallest(100));

Resultado:

 1 :                    1
 2 :                    2
 3 :                    6
 4 :                   12
 5 :                   60
 6 :                   60
 7 :                  420
 8 :                  840
 9 :                 2520
10 :                 2520
11 :                27720
12 :                27720
13 :               360360
14 :               360360
15 :               360360
16 :               720720
17 :             12252240
18 :             12252240
19 :            232792560
20 :            232792560

69720375229712477164533808935312303556800
2021-11-23 18:37:03
1

Mi lógica:

  1. Tomamos un número es el número mínimo de lo que puede ser devuelto
  2. número 1 - si no se puede dividir sin recordatorio añadir a n n inicial

No te olvides de actualizar el número inicial cuando 2 paso ha recordatorio

Hacer esto hasta que usted consigue valor correcto

2021-11-23 18:29:42
1

Usted necesita encontrar el MCM (mínimo Común Múltiplo) de todos los números de 1 to n.

Aquí es un buen ejemplo para encontrar el MCM de un conjunto de elementos. https://www.geeksforgeeks.org/lcm-of-given-array-elements/

Puede crear una matriz con todos los números de 1 a n y se pasa a esta función.

O

Usted puede modificarlo para pasar sólo n y hacer que sea eficaz para el caso de uso.

2021-11-23 18:22:57

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................