Teilen Sie Int in Int und geben Sie Int zurück


79

Ich brauche eine Funktion , die zwei bekommt Ints ( aund b) und kehrt A/Bals Int. Ich bin sicher, dass A/Bdas immer eine ganze Zahl sein wird.

Hier ist meine Lösung:

myDiv :: Int -> Int -> Int
myDiv a b = 
      let x = fromIntegral a
          y = fromIntegral b
      in truncate (x / y)

Aber wollen einfachere Lösung finden. Etwas wie das:

myDiv :: Int -> Int -> Int
myDiv a b = a / b

Wie kann ich Int in Int teilen und Int erhalten?

Antworten:


140

Warum nicht einfach benutzen quot?

quot a b

ist der ganzzahlige Quotient der ganzen Zahlen a und b, die gegen Null abgeschnitten sind.


7
Oder a `quot` bfür die Infix-Liebhaber (wow, können Sie Backticks tatsächlich mit Backslash entkommen?).

38
Auch a `div` b; Wenn ich mich richtig erinnere, quotschneidet er ab (wie es Demas wollten) und divrundet gegen Null. Also (-3) `quot` 4 == 0und (-3) `div` 4 == -1.
Antal Spector-Zabusky

5
+1 für div. Mathematisch besser erzogen, quotist eine Hündin, wenn es negative Zahlen gibt.
Luqui

Das war ein Lebensretter für mich. Ich rang mit fromIntegral (ceiling (int1 / int2))und anderen Dingen - keine davon gab mir eine zurück Int, aber diese tat es.
MuffinTheMan

10
divrundet auf negative Unendlichkeit, nicht auf Null.
Lacuno

1

Folgendes habe ich getan, um mein eigenes zu machen:

quot' a b
         | a<b = 0  -- base case
         | otherwise = 1 + quot' a-b b

2
Schön als Übung, aber nutzlos in der Produktion. Bei großen Zahlen ist es langsam (lineare Zeit) und hat einen hohen Speicherbedarf (nicht rekursiv). Bei negativen Zahlen ist es entweder falsch ( a<0) oder endet nie ( b<0).
Ruud Helderman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.