Codewars Lösung | Primorial Of a Number


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|2. März 2024
4 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

Die Fakten:

Plattform:codewars.com
Name:Primorial Of a Number
Level:6 kyu
Sprache:TypeScript

Beschreibung:

Definition (Primorial Of a Number)

Is similar to factorial of a number, In primorial, not all the natural numbers get multiplied, only prime numbers are multiplied to calculate the primorial of a number. It's denoted with P# and it is the product of the first n prime numbers.


Task

Given a number N , calculate its primorial. !alt !alt


Notes

  • Only positive numbers will be passed (N > 0) .

Input >> Output Examples:

1- numPrimorial (3) ==> return (30)
1 - num_primorial(3, 30).
1 - num_primorial(3) // 30
1 - (num-primorial 3) ;; 30

Explanation:

Since the passed number is (3) ,Then the primorial should obtained by multiplying 2 * 3 * 5 = 30 .

Mathematically written as , P3# = 30 .


2- numPrimorial (5) ==> return (2310)
2 - num_primorial(5, 2310).
2 - num_primorial(5) // 2310
2 - (num-primorial 5) ;; 2310

Explanation:

Since the passed number is (5) ,Then the primorial should obtained by multiplying 2 * 3 * 5 * 7 * 11 = 2310 .

Mathematically written as , P5# = 2310 .


3- numPrimorial (6) ==> return (30030)
3 - num_primorial(6, 30030).
3 - num_primorial(6) // 30030
3 - (num-primorial 6) ;; 30030

Explanation:

Since the passed number is (6) ,Then the primorial should obtained by multiplying 2 * 3 * 5 * 7 * 11 * 13 = 30030 .

Mathematically written as , P6# = 30030 .




Playing with Numbers Series

Playing With Lists/Arrays Series

For More Enjoyable Katas


ALL translations are welcomed

Enjoy Learning !!

Zizou

Quelle: codewars.com

Lösung

Pseudo-Code

Wie immer gibt's reichlich Varianten, hier ist eine meiner.

Erst die Lösungsschritte in Pseudo-Code. Los geht’s:

Lösungsschritte
Schritt 1

Als Erstes sollten wir uns Gedanken um das Prüfen auf eine Primzahl machen, dazu wäre es sinnvoll, die Primzahl-Prüflogik in eine gesonderte Hilfs-Funktion auszulagern.

Schritt 2

Dafür brauchen wir einen Loop, der von 2 bis zur zu prüfenden Zahl loopt und in jedem Loop prüft, ob unsere potentielle Primzahl durch die aktuelle Zahl teilbar ist.

Schritt 3

Außerdem sollte sie möglichst effizient sein, wir können zum Beispiel die "Trial Division" (zu deutsch: "Probedivision") verwenden.

Schritt 4

Wenn wir unsere Prim-Prüf-Hilfsfunktion haben, können wir uns wieder der numPrimorial widmen.

Schritt 5

Auch hier können wir wieder einen Loop verwenden.

Schritt 6

Wenn die aktuelle Zahl eine Primzahl ist, multiplizieren wir sie einfach zu einer Produkt-Variablen hinzu.

Schritt 7

Das müssen wir solange machen bis n erreicht ist.

Code

Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:

Lösungsschritte
Die erste Zeile meiner Prim-Prüf-Hilfsfunktion:
function isPrime(num: number): boolean {
Primzahlen sind nur durch 1 und sich selbst teilbar. Darum können wir erst mal alle Zahlen ausschließen, die kleiner oder gleich 1 sind:
if (num <= 1) return false;
Jetzt der Loop:
  for (let i = 2; i <= Math.sqrt(num); i++) {

Wir legen bei 2 los, weil: siehe oben.

Dann der Clou: Wir loopen nicht bis zu unserer zu prüfenden Zahl, sondern nur bis zu ihrer Wurzel. Wem et interessiert, hier steht mehr dazu.

Jetzt prüfen wir für jede Zahl (ab 2), ob sie unsere potentielle Primzahl teilen kann:
    if (num % i === 0) return false;
  }

Wenn ja, ist unsere potentielle Primzahl keine Primzahl und wir können mit einem false abbrechen.

Ansonsten:
  return true;
}

Gibts ein wunderbares true zurück! Ende der Prim-Prüf-Hilfsfunktion.

Jetzt die erste Zeile meiner Hauptfunktion:
export function numPrimorial(n: number): number {
Auch hier ein Loop:
  for (let i = 0; i < n; ) {

Das i++ lasse ich hier weg, da ich mein i abhängig von einer Bedingung erhöhen möchte.

Hier die Bedingung:
    if (isPrime(num)) {

Hier kommt unsere Primzahl-Prüf-Hilfsfunktion zum Einsatz. num müssen wir oben noch initialisieren. In meinem Fall so: let num = 1

Wenn wir eine Primzahl haben, multiplizieren wir sie zu einer Ergebnis-Variablen:
output *= num;
Auch unseren output müssen wir oben initialisieren: let output = 1. Damit sieht unser Funktions-Kopf etwa so aus:
export function numPrimorial(n: number): number {
  let output = 1;
  let num = 1;
...
Außerdem erhöhen wir bei einer gefundenen Primzahl unser i:
      i++;
    }

Wir wollen ja solange loopen, bis wir n Primzahlen gefunden haben.

Weiter geht’s nach der if-Bedingung:
    num++;
  }

Ob Primzahl oder nicht. In jedem Fall wollen wir die nächste Zahl prüfen. Darum erhöhen wir nach der if-Bedingung unser num um 1:

Nach der For-Schleife geben wir unser Ergebnis zurück:
  return output;
}
Voilá! 💪

Fragen?

Komplettlösung
export function numPrimorial(n: number): number {
  let output = 1;
  let num = 1;

  for (let i = 0; i < n; ) {
    if (isPrime(num)) {
      output *= num;
      i++;
    }
    num++;
  }

  return output;
}

function isPrime(num: number): boolean {
  if (num <= 1) return false;

  for (let i = 2; i <= Math.sqrt(num); i++) {
    if (num % i === 0) return false;
  }

  return true;
}

Feedback

Schreib mir!