C# funkci přijmout celé číslo n a vrátí nejnižší číslo, které lze rozdělit čísla 1..n

0

Otázka

Potřebuju napsat funkci, která bere jako argument číslo n a return (jako řetězec) nejnižší dostupné číslo, které lze vydělit všemi čísly od 1 do n. například, pokud n=4, pak funkce vrátí 12 jako 12/4 12/3 12/2 12/1 jsou celá čísla.

napsal jsem funkci, která funguje, když čísla jsou méně než 19.. nad 19 výpočetní čas je stále mnohem déle. může někdo mi dát tip, jak lépe mechanismus pro tuto funkci dělat to rychlejší

 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

Nejlepší odpověď

1

Budete mít obrovská čísla pro velké nto je důvod, proč pojďme použít BigInteger pro vnitřní výpočty. Jako Abhishek Pandey dát, bychom měli počítat LCM, které lze získat jako

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

kde CGD je Největší Společný Dělitel

Kód:

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

Výsledek:

 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

Moje logika:

  1. Vezmeme číslo - je to minimální počet, co může být vrácena
  2. číslo 1 - pokud nelze rozdělit bez připomenutí přidat do n původní n

Nezapomeňte aktualizovat číslo počáteční když 2 krok má připomínka

To udělat, až se dostanete správnou hodnotu

2021-11-23 18:29:42
1

Musíte najít LCM (nejmenší Společný Násobek) čísel, ze 1 to n.

Zde je dobrý příklad, jak najít nejmenší společný násobek pole prvků. https://www.geeksforgeeks.org/lcm-of-given-array-elements/

Můžete vytvořit pole všech čísel od 1 do n a předat jej do této funkce.

NEBO

Můžete jej upravit, aby projít pouze n a aby to bylo efektivní pro váš případ použití.

2021-11-23 18:22:57

V jiných jazycích

Tato stránka je v jiných jazycích

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