Versuchen Sie, n-ary Addition in Java zu implementieren

Moe Nishinozono breitete die Hände neben ihrem Gesicht aus. Es ist keine Geste, dass die Menschheit das Dezimalsystem übernommen hat. (Aus "30 kleine Indianer" in Hirotsugu Moris Kurzfassung "Erasing Madoromi")

1. 1. Einführung

Neulich las ich das obige Mystery-Buch noch einmal, das ich bei der Organisation des Bücherregals im Haus meiner Eltern gefunden hatte, aber ich begann zu denken, dass ich ein Programm mit Bezug zur $ n $ -Notation erstellen möchte, weil es eine große Sache ist. .. Lassen Sie uns diesmal die quaternäre Addition in Java als Beispiel für die $ n $ -Notation implementieren. Wie der Titel $ n $ sagt, streben wir eine Codierung an, die in binärer, quaternärer oder hexadezimaler Notation verwendet werden kann.

2. Problemstellung

Angenommen, es gibt Menschen in einem Land, die immer in quaternärer Notation rechnen. Die Zahlen, die sie verwenden, unterscheiden sich von den Zahlen, die wir verwenden, und sie scheinen dem Alphabet zu ähneln. Nach einer Untersuchung stellte ich fest, dass die Korrespondenz wie folgt war.

Quadratische Menschen wir So etwas wie eine Ausrede
P 0 Abgerundet ist wie 0
I 1 Es sieht aus wie 1
T 2 Da die Anzahl der Striche 2 beträgt, ...
M 3 Drehen Sie 3 um 90 ° nach links und es sieht aus wie M.

Wenn sie "ITPM" schreiben, ist es $ 1203_ {(4)} $ in der von uns verwendeten Dezimalzahl

1203_{(4)} = 1 × 4^3 + 2 × 4^2 + 0 × 4 + 3 × 1 = 64 + 32 + 0 + 3 = 99

Es bedeutet das Erstellen Sie bei zwei quaternären Zahlen ein Programm, das das Ergebnis des Hinzufügens in quaternärer Notation unter Verwendung des obigen Alphabets ausgibt. Zum Beispiel "I" und "TPM"

1_{(4)} + 203_{(4)} = 1 + 35 = 36 = 210_{(4)}

Daher wird angenommen, dass "TIP" ausgegeben wird. Wie ich am Anfang geschrieben habe, möchte ich es diesmal als $ n $ -Notation schreiben, anstatt nur eine quaternäre Verarbeitung zu erstellen.

3. 3. Implementierung

Da es schwierig ist, alle Berechnungsprozesse mit $ n $ Basiszahlen zu erstellen, konvertieren wir die beiden Zahlen in Dezimalzahlen, berechnen sie und geben sie dann in $ n $ Basiszahlen zurück.

NAryNumber-Klasse

Erstens der Wert von $ n $, der die Basisnummer angibt, und die Nummer oder das Zeichen, die in jeder Ziffer der $ n $ -Basis verwendet werden (z. B. hexadezimal anstelle von dezimal 10, 11, 12, ……, 15 Erstellen Sie eine Klasse NAryNumber zum Speichern von A, B, C, ……, F). Zusätzlich ist jedem Ort ein Alphabet [A-Za-z] oder eine Nummer [0-9] zuzuweisen.

class NAryNumber {
	private int N;									//N-Wert von N-ary
	private char[] characters;						// 0~N-Zeichen entsprechend 1
	private HashMap<Character, Integer> numbers;	// 0~N-Die Nummer, die dem ersten Buchstaben entspricht

	public NAryNumber(int n, char[] c) {
		this.N = n;
		this.characters = c.clone();
		this.numbers = new HashMap<Character, Integer>();
		for (int i = 0; i < this.characters.length; i ++) {
			numbers.put(this.characters[i], i);
		}
	}
}

Die Dezimalschreibweise verwendet 10 Zahlen von 0 bis 9, aber in ähnlicher Weise verwendet die Notation $ n $ $ n $ Zeichen von 0 bis $ n-1 $. Die erste Mitgliedsvariable N enthält den Wert dieses $ n $. Die jeder Nummer zugewiesenen Zeichen werden in die Zeichenzeichenzeichenzeichen eingegeben, aber die Reihenfolge der Eingabe ist immer das Zeichen, das 0 entspricht, das Zeichen, das 1 entspricht, das Zeichen, das 2 entspricht, und so weiter. Und jeder Wert von 0, 1, 2, ... wird in einem Datentyp gespeichert, der als assoziatives Array bezeichnet wird, anstatt in einem Array mit dem Namen "Zahlen". Diese assoziative Anordnung ist der Teil dieses Artikels, in dem ich mich gut fühle, obwohl ich es nicht gut verstehe.

Gewöhnliche Arrays werden immer nach Ganzzahlen geordnet, die größer oder gleich 0 sind, z. B. 0, 1 und 2. Zu diesem Zeitpunkt heißen 0, 1, 2, …… __index __ oder __subscript __. Andererseits können assoziative Arrays nicht nur Ganzzahlen, sondern auch Zeichenfolgen als Indizes verwenden. Die zu diesem Zeitpunkt für den Index verwendete Zeichenfolge heißt key (Schlüssel).

Der Grund, warum ich mich überhaupt für die Verwendung eines assoziativen Arrays entschieden habe, ist beispielsweise der Versuch, eine quaternäre Zahl mit dem obigen quaternären System in eine Dezimalzahl umzuwandeln, wobei nur die Zeichen des Typs char verwendet werden 'T' ist da! ⇒ Welche Zahl ist das gespeicherte Zeichen von 'T'? ⇒ (Während Sie die Werte im Array einzeln überprüfen) Oh, es ist der dritte! ⇒ Dann ist es 2 Das liegt daran, dass ich dachte, es wäre mühsam, ein wenig zu schreiben (obwohl es nicht unmöglich ist). Wenn Sie dagegen die assoziativen Array-Nummern verwenden, können Sie den Schlüssel 'T'attach 2 dazu machen, sodass Sie 2 erhalten, indem Sie numbers.get (' T ') schreiben.

Erstellen Sie in der NAryNumber-Klasse eine Methode convFromNAryToDec, die eine bestimmte $ n $ -Basisnummer in eine Dezimalzahl konvertiert, und eine Methode convFromDecToNAry, die eine bestimmte Dezimalzahl in eine $ n $ -Basisnummer konvertiert.

convFromNAryToDec-Methode

Um $ n $ base in eine Dezimalzahl umzuwandeln, müssen Sie herausfinden, um welche Stelle es sich handelt. In Dezimalschreibweise folgt beispielsweise auf den 1. Platz der 10. Platz, der 100. Platz und der 1000. Platz. In der binären Notation folgt auf den 1. Platz der 2. Platz, der 4. Platz und der 8. Platz. Auf diese Weise werden im $ n $ -System die $ n $ Stelle, die $ n ^ 2 $ Stelle und die $ n ^ 3 $ Stelle in der Reihenfolge ab der 1. Stelle verfolgt, also multiplizieren Sie diese Zahl mit der Zahl jeder Stelle. Wenn Sie die Summe finden, haben Sie eine $ n $ Basisnummer. Da die Anzahl der eingegebenen Ziffern nicht festgelegt ist, berechnen wir die Anzahl der Ziffern aus der Länge der Zeichenfolge. Deshalb habe ich beschlossen, jeder Person früher einen Charakter zuzuweisen.

public int convFromNAryToDec(String nAry) {
	int dec = 0;	//Wert, der durch Konvertieren der N-fachen Zahl in eine Dezimalzahl erhalten wird
	for (int i = 0; i < nAry.length(); i ++) {
		//Finden Sie die Summe in der Reihenfolge vom 1. Platz
		dec += numbers.get(nAry.charAt(nAry.length() - 1 - i)) * Math.pow(N, i);
	}
	return dec;
}

convFromDecToNAry-Methode

Ich konvertiere von dezimal nach $ n $, aber diesmal ist es das Gegenteil, das heißt, dividieren statt multiplizieren. Im $ n $ -System erhöht sich die nächste Ziffer, wenn die Anzahl der $ n $ zählt. Wir möchten also wissen, wie viele $ n $ Teile zusammen gruppiert werden können, dh wie oft sie nach oben verschoben werden. Beachten Sie jedoch, dass der Rest nach dem Teilen durch $ n $ die Zahl für jede Ziffer ist, aber in der Reihenfolge von der __1 Ziffer __ berechnet wird. Mit anderen Worten, wenn Sie die Reste in der Reihenfolge verbinden, in der Sie sie angefordert haben, werden die Antworten in umgekehrter Reihenfolge angezeigt. Am Ende müssen Sie also die Reihenfolge der Zeichenfolgen umkehren.

public String convFromDecToNAry(int dec) {
	String nAryRev = "";
	//Die Reihenfolge, in der der Rest gesucht wurde(Umgekehrte Reihenfolge)In N-ary konvertieren
	while (dec >= this.N) {
		int rem = dec % this.N;
		dec = (dec - rem) / N;
		nAryRev += this.characters[rem];
	}
	nAryRev += this.characters[dec];
	//Invertieren Sie die Zeichenfolge und kehren Sie dann zurück
	return new StringBuffer(nAryRev).reverse().toString();
}

Zuletzt werde ich den Eingabeteil erstellen, aber da es schwierig ist, den Wert von $ n $ und die Zeichen, die für jeden Ort verwendet werden sollen, jedes Mal von der Konsole aus einzugeben, werde ich den Wert nur dieses Mal direkt in das Programm schreiben. Zur Zeit planen wir eine Fortsetzung, aber in diesem Fall werden wir die Einstellungen lesen, die in der Textdatei geschrieben sind. Bitte verzeihen Sie mir diesmal.

4. Komplett

Als solches ist das abgeschlossene Programm wie folgt. In der zu Beginn gezeigten quaternären Einstellung wird der Eingabeteil geschrieben, um I + TPM zu berechnen. Das Ausgabeergebnis ist TIP.

Programm zum Ermitteln der Summe zweier quaternärer Zahlen (zum Öffnen klicken)
import java.util.HashMap;

class NAryNumberTest {
	public static void main(String args[]) {
		//Eingang
		int N = 4;
		char[] characters = {'P', 'I', 'T', 'M'};
		String val1 = "I";
		String val2 = "TPM";
		
		//wird bearbeitet
		NAryNumber nary = new NAryNumber(N, characters);
		String result = nary.convFromDecToNAry(
			nary.convFromNAryToDec(val1) + nary.convFromNAryToDec(val2)
		);
		System.out.println(result);
	}
}

class NAryNumber {
	private int N;									//N-Wert von N-ary
	private char[] characters;						// 0~N-Zeichen entsprechend 1
	private HashMap<Character, Integer> numbers;	// 0~N-Die Nummer, die dem ersten Buchstaben entspricht

	public NAryNumber(int n, char[] c) {
		this.N = n;
		this.characters = c.clone();
		this.numbers = new HashMap<Character, Integer>();
		for (int i = 0; i < this.characters.length; i ++) {
			numbers.put(this.characters[i], i);
		}
	}
	public int convFromNAryToDec(String nAry) {
		int dec = 0;	//Wert, der durch Konvertieren der N-fachen Zahl in eine Dezimalzahl erhalten wird
		for (int i = 0; i < nAry.length(); i ++) {
			//Finden Sie die Summe in der Reihenfolge vom 1. Platz
			dec += numbers.get(nAry.charAt(nAry.length() - 1 - i)) * Math.pow(N, i);
		}
		return dec;
	}
	public String convFromDecToNAry(int dec) {
		String nAryRev = "";
		//Die Reihenfolge, in der der Rest gesucht wurde(Umgekehrte Reihenfolge)In N-ary konvertieren
		while (dec >= this.N) {
			int rem = dec % this.N;
			dec = (dec - rem) / N;
			nAryRev += this.characters[rem];
		}
		nAryRev += this.characters[dec];
		//Invertieren Sie die Zeichenfolge und kehren Sie dann zurück
		return new StringBuffer(nAryRev).reverse().toString();
	}
}

Übrigens, wenn Sie den Eingabeteil am Anfang wie folgt umschreiben, können Sie auch in hexadezimaler Notation berechnen. Das Ausgabeergebnis ist FFFFF.

Ein Programm, das die Summe zweier Hexadezimalzahlen berechnet (zum Öffnen klicken)
import java.util.HashMap;

class NAryNumberTest {
	public static void main(String args[]) {
		//Eingang
		int N = 16;
		char[] characters = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'A', 'B', 'C', 'D', 'E', 'F'};
		String val1 = "12345";
		String val2 = "EDCBA";
		
		//wird bearbeitet
		NAryNumber nary = new NAryNumber(N, characters);
		String result = nary.convFromDecToNAry(
			nary.convFromNAryToDec(val1) + nary.convFromNAryToDec(val2)
		);
		System.out.println(result);
	}
}

class NAryNumber {
	private int N;									//N-Wert von N-ary
	private char[] characters;						// 0~N-Zeichen entsprechend 1
	private HashMap<Character, Integer> numbers;	// 0~N-Die Nummer, die dem ersten Buchstaben entspricht

	public NAryNumber(int n, char[] c) {
		this.N = n;
		this.characters = c.clone();
		this.numbers = new HashMap<Character, Integer>();
		for (int i = 0; i < this.characters.length; i ++) {
			numbers.put(this.characters[i], i);
		}
	}
	public int convFromNAryToDec(String nAry) {
		int dec = 0;	//Wert, der durch Konvertieren der N-fachen Zahl in eine Dezimalzahl erhalten wird
		for (int i = 0; i < nAry.length(); i ++) {
			//
			dec += numbers.get(nAry.charAt(nAry.length() - 1 - i)) * Math.pow(N, i);
		}
		return dec;
	}
	public String convFromDecToNAry(int dec) {
		String nAryRev = "";
		//()
		while (dec >= this.N) {
			int rem = dec % this.N;
			dec = (dec - rem) / N;
			nAryRev += this.characters[rem];
		}
		nAryRev += this.characters[dec];
		//
		return new StringBuffer(nAryRev).reverse().toString();
	}
}

Die Reihenfolge, in der der Rest erhalten wurde Invertieren Sie die zu konvertierende Zeichenfolge in N-ary in umgekehrter Reihenfolge des tatsächlichen Werts und geben Sie sie dann zurück. Dieses Mal habe ich hauptsächlich die Konvertierung der Dezimalzahl $ n $ base ⇔ implementiert. Wenn möglich, möchte ich einen Prozess implementieren, der die in der Textdatei geschriebenen Einstellungen wie oben beschrieben lesen und die über die Konsole eingegebene Formel berechnen kann. Wir werden als zukünftige Themen daran arbeiten. Wenn Sie noch eine Chance haben, verstehen Sie sich bitte mit mir. Danke fürs Lesen.

Nebenbei: Bild von Klasse und Kapselung für mich

Hinzugefügt am 13. Dezember In den Kommentaren unten haben Sie auf die Schnittstelle hingewiesen. Bitte probieren Sie es aus.

Es ist eine lange Zeit, aber bitte vergib mir.

Als ich diesen Artikel schrieb, fragte ich mich, worum es bei Klassen und Kapselungen ging. Natürlich kann ich diese Erklärungen in Büchern und im Internet nachschlagen, aber als ich mich fragte, ob es eine Denkweise gibt, die zu mir passt, habe ich mir ein Beispiel ausgedacht, das ich persönlich verstehen könnte. ..

Als Sie in der Grundschule oder in der Mittelschule waren, hatten Sie die Rolle, Mitglied der Schule zu sein. Klassenmitglieder, Bibliotheksmitglieder, Gesundheitsmitglieder usw. Natürlich gibt es keine Person, die zum XX-Komiteemitglied ernannt wurde. Die wahre Identität ist Nantoka Taro, Nantoka Hanako und andere Menschen, die tatsächlich existieren. Nehmen wir also an, die Klasse __ bezieht sich auf eine __spezifische Rolle wie ein Mitglied des Bibliotheksausschusses, und die Person oder Sache, die diese __ Rolle tatsächlich spielt, ist eine Entität (Instanz) __. Zum Beispiel scheint Yuki Nantoka, der in der Bibliothek immer leise Bücher liest und je nach Tag eine Brille trägt oder nicht trägt, die Einheit einer Klasse namens Library Committee zu sein.

Etwas wahnhafter ist, dass es in der Klasse des Bibliotheksausschusses eine Variable gibt, die als Buchleihliste bezeichnet wird. Aus Datenschutzgründen ist diese Liste für nicht autorisierte Personen nicht sichtbar. Fügen Sie daher den Modifikator private hinzu. Fügen Sie stattdessen den Modifikator public zur Methode "Leihliste anzeigen" hinzu, um die Leihliste der Bücher nur bestimmten Personen wie Lehrern und anderen Bibliotheksmitgliedern anzuzeigen. Dann kann ein Prozess, bei dem eine Person (ein anderer Programmierer), der mit der Arbeit des Bibliotheksausschusses nicht vertraut ist, von einer nicht autorisierten Person auf die Leihliste schaut (ein Prozess, der ursprünglich nicht erwartet wurde ⇒ kann einen Fehler verursachen). Sie können die Situation des Schreibens vermeiden (es wird ein Fehler sein, wenn Sie es schreiben). Auf diese Weise besteht eine der Ideen von encapsulation darin, Variablen und Methoden (als Mitgliedsvariablen und Mitgliedsmethoden bezeichnet) in der Klasse von außerhalb der Klasse unzugänglich zu machen und zu entscheiden, wie auf sie verwiesen werden soll. Abteilung).

maruhi_gokuhibunsyo.png

Darüber hinaus werden einige Bibliotheksmitglieder als Bibliotheksmitglieder __Chief __ bezeichnet, die an der Spitze der Bibliotheksmitglieder in der Schule stehen. Wenn Sie eine Klasse mit dem Namen Library Committee Chief von Grund auf neu erstellen, treten Ineffizienzen auf, z. B. das Kopieren der Variablen und Methoden des Library Committee (wenn sich die Spezifikationen der Buchleihliste ändern, wird das Library Committee veröffentlicht. Sowohl die Klasse als auch das Bibliothekskomitee __long__class müssen ebenfalls neu geschrieben werden!). Daher können durch Erstellen einer Bibliotheksausschussklasse _long __ durch Erben der Bibliotheksausschussklasse __ die Variablen und Methoden der Bibliotheksausschussklasse verwendet werden, ohne dass sie geschrieben werden müssen. Es fühlt sich so an, als wäre es in Ordnung, wenn Sie nur die für long eindeutige Rolle hinzufügen (z. B. die Verwaltung der Anwesenheit der Mitglieder des Bibliotheksausschusses).

Wenn eine Rolle das ist, was die Klasse wirklich ist, ist es wichtig, ihr einen __namen zu geben, der für andere Programmierer leicht zu verstehen ist. Ich versuche immer, coole englische Wörter zu machen, aber normalerweise sind die Ergebnisse halbherzig. Die NAryNumber-Klasse ist diesmal auch ein Produkt davon. Übrigens ist conv im Methodennamen eine Abkürzung für convert und Dec eine Abkürzung für Decimal, aber es ist bedeutungslos, wenn es nicht übertragen wird. Bitte beachten Sie, dass eine solche Benennung nicht sehr gut ist.

Vielen Dank für das Lesen an einem solchen Ort.

Recommended Posts

Versuchen Sie, n-ary Addition in Java zu implementieren
Versuchen Sie, Yuma in Java zu implementieren
Versuchen Sie, Yuma in Ruby zu implementieren
[Java] Versuchen Sie, mithilfe von Generika zu implementieren
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Versuchen Sie, Project Euler in Java zu lösen
So erzwingen Sie Codierungskonventionen in Java
Versuchen Sie, ein Bulletin Board in Java zu erstellen
Versuchen Sie, TCP / IP + NIO mit JAVA zu implementieren
Versuchen Sie es mit RocksDB mit Java
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
Versuchen Sie, JavaScript in Java aufzurufen
Lassen Sie uns Spresense mit Java entwickeln (1)
Probieren Sie den Funktionstyp in Java aus! ①
Implementierung der zweistufigen Authentifizierung in Java
Versuchen Sie, ein Zusatzprogramm in mehreren Sprachen zu erstellen
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Implementieren Sie das Senden von E-Mails in Java
Versuchen Sie, ein eingeschränktes FizzBuzz-Problem in Java zu lösen
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Zusammenfassung der Implementierung von Standardargumenten in Java
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
[Java] So implementieren Sie Multithreading
Implementieren Sie rm -rf in Java.
Implementieren Sie die XML-Signatur in Java
[Einführung in die Informatik Nr. 0: Versuchen Sie maschinelles Lernen] Lassen Sie uns die k-Mittelungsmethode in Java implementieren
Implementieren Sie Thread in Java und versuchen Sie, die anonyme Klasse Lambda zu verwenden
Implementieren Sie einen tabellengesteuerten Test in Java 14
Versuchen Sie, Android Hilt in Java zu implementieren
3 Implementieren Sie einen einfachen Interpreter in Java
Multithreaded passend zur [Java] Vorlage
Versuchen Sie, die iOS14-Widget-Funktion zu implementieren
Wie man JAVA in 7 Tagen lernt
Versuchen Sie, Selenuim 3.141.59 mit Eclipse (Java) auszuführen.
Implementieren Sie reCAPTCHA v3 in Java / Spring
Implementieren Sie die PHP-Implodierungsfunktion in Java
Versuchen Sie einen If-Ausdruck in Java
Protokollausgabe in Datei in Java
Versuchen Sie, die öffentliche Java-Methode zu extrahieren
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
Versuchen Sie, AWS X-Ray in Java auszuführen
1 Implementieren Sie eine einfache Phrasenanalyse in Java
So verketten Sie Zeichenfolgen mit Java
So testen Sie die Java-Vorschaufunktion (z. B. Java 15 Record) mit IntelliJ
So implementieren Sie einen Job, der die Java-API in JobScheduler verwendet
Schnittstelle Versuchen Sie, Java-Problem TypeScript 7-3 zu machen
So implementieren Sie Suchfunktionen in Rails
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Einfach, Slack Bot mit Java zu machen
Java-Referenz zum Verständnis in der Abbildung
Versuchen Sie es mit der Stream-API in Java
So führen Sie eine Basiskonvertierung in Java durch
Versuchen Sie es mit der JSON-Format-API in Java
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen