6 Stimmen

Zählen von Brüchen über ganze Zahlen

Ich erhalte eine ganze Zahl, die einen Dollarbetrag in Bruchteilen darstellt. Ich möchte einen Algorithmus, der diese Zahlen addieren kann, ohne sie zu analysieren und in Zweier- oder Dezimalzahlen umzuwandeln.

Ich erhalte zum Beispiel die ganze Zahl 50155, was 50 und 15,5/32 Dollar bedeutet. Ich erhalte dann 10210, was 10 und 21/32 Dollar entspricht. Also 50 15,5/32 + 10 21/32 = 61 4,5/32, also:

50155 + 10210 = 61045

Auch dies möchte ich vermeiden:

int a = 50155;
int b = a / 1000;
float c = a % 1000;
float d = b;
d += c / 320f;
// d = 50.484375

Das wäre mir viel lieber:

int a = 50155;
int b = 10210;
int c = MyClass.Add(a.b); // c = 61045
...
public int Add(int a, int b)
{
    // ?????
}

Vielen Dank im Voraus für die Hilfe!

0voto

Wenn Sie darauf bestehen, mit Ints zu arbeiten, können Sie Ihr Problem nicht ohne Parsing lösen - schließlich sind Ihre Daten keine Integer. Ich weise auf die (bisher) 3 Antworten hin, die alle Ihre Ints in ihre Komponenten zerlegen, bevor sie arithmetische Berechnungen durchführen.

Eine Alternative wäre die Verwendung von rationalen Zahlen mit 2 (ganzzahligen) Komponenten, eine für den ganzen Teil und eine für die Anzahl der 320stel im gebrochenen Teil. Dann implementieren Sie die entsprechende rationale Arithmetik. Wie immer gilt: Wählen Sie Ihre Datendarstellungen sorgfältig aus, und Ihre Algorithmen werden viel einfacher zu implementieren sein.

Ich kann nicht sagen, dass ich diese Alternative auf irgendeiner Vergleichsachse für besser halte, aber sie könnte Ihren Drang befriedigen, nicht zu parsen.

0voto

Daren Thomas Punkte 64742

HINWEIS : Dieser Beitrag ist falsch, falsch , falsch . Ich werde sie entfernen, sobald ich mich nicht mehr wie ein Narr fühle, weil ich sie ausprobiert habe.

Hier ist mein Versuch: Sie können Raum gegen Zeit tauschen .

Konstruieren Sie eine Zuordnung der ersten 10 Bits zu einem Tupel: Anzahl der Dollars, Anzahl der Stücke von 32. Verwenden Sie dann die Bitmanipulation für Ihre Ganzzahl:

  • Bits 11 und höher ignorieren, Karte anwenden.
  • Verschiebe die ganze Zahl 10 Mal, füge Kleingelddollar aus der obigen Abbildung hinzu
  • Sie haben jetzt den Dollarbetrag und den Betrag von 32 Stück
  • beides hinzufügen
    • Überlauf auf Dollar-Betrag verschieben

Um nun wieder in die "kanonische" Notation umzuwandeln, benötigen Sie eine umgekehrte Zuordnung für Ihre 32er-Stücke und "leihen" sich Dollar, um die Bits aufzufüllen. Heben Sie die Dollars 10-mal auf und addieren Sie die piecesof32.

EDIT: Ich sollte das entfernen, aber ich schäme mich zu sehr. Natürlich, es kann nicht Arbeit. Ich bin so dumm :(

Der Grund dafür ist, dass die Verschiebung um 10 nach rechts dasselbe ist wie die Division durch 1024 - es ist ja nicht so, dass einige der unteren Bits einen Dollarbetrag und einige einen 32-Stück-Betrag haben. Die dezimale und die binäre Schreibweise lassen sich einfach nicht gut trennen. Deshalb verwenden wir die hexadezimale Schreibweise (Gruppierung von 4 Bits). Schade.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X