C# funkciu prijať celé číslo n a vrátiť najnižšie číslo, ktoré môžete rozdeliť čísla 1..n

0

Otázka

Musím napísať funkciu, ktorá berie ako argument číslo n a vrátiť (ako reťazec) najnižšie dostupné číslo, ktoré môže rozdeliť všetky čísla od 1 do n. napríklad, ak n=4, potom funkcia vráti 12 ako 12/4 12/3 12/2 12/1 sú celé čísla.

napísal som funkcia pre to, čo funguje v poriadku, keď sú čísla menej ako 19.. nad 19 výpočtovej čas je stále oveľa dlhšie. niekto môže mi dať tip, ako lepšie mechanizmus pre túto funkciu, ak chcete robiť to rýchlejšie

 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

Najlepšiu odpoveď

1

Budete mať obrovské čísla pre veľké n, preto použime BigInteger pre vnútorné výpočtu. Ako Abhishek Pandey to dal, mali by sme počítať LCM,, ktoré môžu byť získané ako

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

kde CGD je Najväčší Spoločný Deliteľ

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

Ukážka:

  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ýsledok:

 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. Vezmeme číslo - to je minimálny počet, čo môže byť vrátené
  2. číslo - 1 - ak sa nedá rozdeliť žiadne pripomienky pridať k n počiatočné n

Nezabudnite aktualizovať číslo počiatočného pri 2 krok má pripomienky

Robiť to, kým sa dostanete správnu hodnotu

2021-11-23 18:29:42
1

Budete musieť nájsť LCM (najmenší Spoločný Násobok) všetky čísla od 1 to n.

Tu je dobrý príklad nájsť LCM pole prvkov. https://www.geeksforgeeks.org/lcm-of-given-array-elements/

Môžete vytvoriť pole všetky čísla od 1 do n a odovzdať ho do tejto funkcie.

ALEBO

Môžete upraviť prejde len n a aby to efektívne pre váš prípad použitia.

2021-11-23 18:22:57

V iných jazykoch

Táto stránka je v iných jazykoch

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