Funkcja c# przyjmuje liczbę całkowitą n i zwraca najmniejszą liczbę, która może dzielenie liczb 1..n

0

Pytanie

Potrzebuję napisać funkcję, która przyjmuje jako argument liczbę n i zwraca (w postaci linii) najmniejszą dostępną wartość, którą można podzielić na wszystkie liczby od 1 do n. przykład, jeśli n=4, to funkcja zwróci 12, tak jak 12/4, 12/3, 12/2, 12/1-to liczby całkowite.

napisałem do tego funkcję, która działa, gdy liczby mniejsze od 19.. powyżej 19, komputerowe czasie staje się znacznie więcej. czy może ktoś dać mi jakieś wskazówki, jak poprawić mechanizm tej funkcji, aby zrobić to szybciej

 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

Najlepsza odpowiedź

1

Masz ogromne cyfry dla dużych ndlatego użyjmy BigInteger do wewnętrznych obliczeń. Jak to ujął Abhishek Pandey, musimy obliczyć LCM, które mogą być generowane w postaci

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

gdzie CGD - Największy wspólny dzielnik

Kod:

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();
}

Demonstracja:

  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));

Wynik:

 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

Moja logika:

  1. Bierzemy liczbę - jest to minimalna liczba, którą można odzyskać
  2. liczba - 1 - jeśli ono nie może się rozdzielić bez przypomnienia, dodaj do n początkowy n

Nie zapomnij, aby uaktualnić pokój do początkowego, gdy na 2 kroku pojawi się przypomnienie

Rób to tak długo, aż pojawi się właściwa wartość

2021-11-23 18:29:42
1

Trzeba znaleźć LCM (najmniejsza wspólna wielokrotność wszystkich liczb ze 1 to n.

Oto dobry przykład dla wyszukiwania LCM tablicy elementów. https://www.geeksforgeeks.org/lcm-of-given-array-elements/

Możesz utworzyć tablicę z wszystkich liczb całkowitych od 1 do n i przekazać go z tej funkcji.

lub

Można go zmienić, aby odbywał się on tylko n i zrób go skuteczne w przypadku użytkowania.

2021-11-23 18:22:57

W innych językach

Ta strona jest w innych językach

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