C # işlevi n tamsayısını kabul eder ve sayıları 1'e bölebilecek en düşük sayıyı döndürür..n

0

Soru

Bağımsız değişken numarası n olarak alan ve 1'den n'ye kadar olan tüm sayılara bölünebilen en düşük kullanılabilir sayıyı (dize olarak) döndüren bir işlev yazmam gerekiyor. örnek n = 4 ise, işlev 12/4 12/3 12/2 12/1 tam sayı olduğu için 12 döndürür.

sayılar 19'dan küçük olduğunda iyi çalışan bir işlev yazdım.. 19'un üzerinde hesaplama süresi çok uzuyor. birisi bana bu işlevin mekanizmasını daha hızlı yapmak için nasıl daha iyi hale getireceğime dair bir ipucu verebilir mi

 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

En iyi cevabı

1

Sen büyük için büyük sayılar olacak n bunu neden kullanalım BigInteger içsel hesaplama için. Abhishek Pandey'nin dediği gibi, hesaplamalıyız LCM, olarak elde edilebilir

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

cgd'nin En Büyük Ortak Bölen olduğu Yer

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

Gösteri:

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

Sonuç:

 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

Benim mantığım:

  1. Bir sayı alıyoruz-iade edilebilecek minimum sayı
  2. sayı - 1-hatırlatıcı olmadan bölünemezse, n'ye ilk n ekleyin

2. adımda hatırlatıcı olduğunda numarayı ilk olarak güncellemeyi unutmayın

Doğru değeri elde edene kadar bunu yapın

2021-11-23 18:29:42
1

Tüm sayıların lcm'sini (En Düşük Ortak Kat) bulmanız gerekir 1 to n.

Bir dizi öğenin lcm'sini bulmak için iyi bir örnek. https://www.geeksforgeeks.org/lcm-of-given-array-elements/

1'den n'ye kadar olan tüm sayılardan oluşan bir dizi oluşturabilir ve bu işleve aktarabilirsiniz.

veya

Sadece geçmek için değiştirebilirsiniz n ve kullanım durumunuz için verimli hale getirin.

2021-11-23 18:22:57

Diğer dillerde

Bu sayfa diğer dillerde

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