# Algorithmus, Zahl in andere Basis konvertieren (26, ->Buchstaben)



## DarthShader (24. April 2007)

Hallo zusammen

ich sitze hier gerade an einem kleinen Problem, und ich finds fast lächerlich, dass ich es einfach nicht gebacken bekomme: es geht um eine Zahlenkovertierung in eine andere Basis.

Nehmen wir an, die Buchstaben A bis Z seien durchnummeriert von 1 bis 26, repräsentieren also ihre Position im Alphabet.

Nun habe ich die Zahl 1, welche kovertiert würde zu A, 2 = B, 3 = C, Z = 26 usw...
Die Zahl 27 würde durch AA repräsentiert, 28 = AB etc...

Ich versuche gerade eine Methode zu schreiben, die mir diese Konvertierung ermöglicht, also als Signatur quasi

  public String numToString( int num );

schaffe es aber nicht, sie fehlerfrei hinzubekommen.

Kann mir jemand den Algorithmus mal schriftlich skizzieren oder bissl Pseudocode geben, vllt. hat ja jemand schon ein (mögl. ähnliches) funktionierendes Beispiel?


Vielen Dank!


----------



## lernen.2007 (24. April 2007)

Hallo,

einfachste Methode ist du legst eine Array mit alle deine Buchstaben an und dann musst du nachher einfach mit num-1 drauf zugreifen und die Buchstaben rausholen wie z.B.

  public String numToString( int num ) {
String[] buchstaben = {"A","B","C","D","E" usw.

return buchstaben[num-1];


}

Sobald du dann über 26 kommst dann musst du nur noch String buchstabe = buchstaben[26] + buchstaben[27]; machen.


----------



## deepthroat (24. April 2007)

Hi.

Evtl. hilft dir das http://www.tutorials.de/forum/c-c/210339-konvertierung-unsigned-long-folge-von-buchstaben.html ein bisschen weiter...

Gruß


----------



## Matthias Reitinger (24. April 2007)

```
public String numToString(int num) {
	StringBuilder sb = new StringBuilder();
	while (num > 0) {
		  sb.append((char)('A' + num % 26));
		  num /= 26;
	}
	return sb.reverse().toString();
}
```
Mit den Zuordnungen A = 0, B = 1, ..., Z = 25

Grüße,
Matthias


----------



## deepthroat (24. April 2007)

Hi.





Matthias Reitinger hat gesagt.:


> ```
> public String numToString(int num) {
> StringBuilder sb = new StringBuilder();
> while (num > 0) {
> ...


So einfach ist es leider nicht. Denn dieses System entspricht nicht unseren normalen Zahlensystemen. Wenn A = 0 ist, kann AA nicht 26 sein.

D.h. bei deiner Funktion wird 0 durch einen Leerstring repräsentiert, 1 dann durch B usw. Die Zahl 26 dann durch BA. Es sollte aber etwas anderes herauskommen.

Gruß


----------



## Matthias Reitinger (25. April 2007)

deepthroat hat gesagt.:


> So einfach ist es leider nicht. Denn dieses System entspricht nicht unseren normalen Zahlensystemen. Wenn A = 0 ist, kann AA nicht 26 sein.


Hab auch nie behauptet, dass mit meiner Zuordnung AA 26 entspricht  Aber irgendein Zeichen muss nun mal die Wertigkeit 0 aufweisen.



deepthroat hat gesagt.:


> D.h. bei deiner Funktion wird 0 durch einen Leerstring repräsentiert, 1 dann durch B usw. Die Zahl 26 dann durch BA. Es sollte aber etwas anderes herauskommen.


Das mit dem Leerstring könnte man als Sonderfall abfangen und "A" zurückgeben. Ansonsten ist die Konvertierung 26 -> BA konform zu der von mir angegebenen Zuordnung von Zeichen zu ihren Wertigkeiten. Ich habe mir eben erlaubt, diese gegenüber dem Vorschlag des OP entsprechend anzupassen, da ein Zeichen mit Wertigkeit 0 fehlte.

Grüße,
Matthias


----------



## deepthroat (25. April 2007)

Hi.





Matthias Reitinger hat gesagt.:


> Hab auch nie behauptet, dass mit meiner Zuordnung AA 26 entspricht  Aber irgendein Zeichen muss nun mal die Wertigkeit 0 aufweisen.
> 
> 
> Das mit dem Leerstring könnte man als Sonderfall abfangen und "A" zurückgeben. Ansonsten ist die Konvertierung 26 -> BA konform zu der von mir angegebenen Zuordnung von Zeichen zu ihren Wertigkeiten. Ich habe mir eben erlaubt, diese gegenüber dem Vorschlag des OP entsprechend anzupassen, da ein Zeichen mit Wertigkeit 0 fehlte.


Früher in der Schule gab's für sowas eine 6 - mit dem Hinweis die Aufgabe richtig zu lesen. ;-) 

Gruß


----------



## KlaDi (25. April 2007)

Hallo,

also ich verstehe nicht, warum man dafür ne 6 bekommen sollte? Nur weil A = 0 ist? Davon bekommt der Anwender doch eh nichts mit und ein Array beginnt nunmal mit dem Index 0 in über 50% der Programmiersprachen. Wenn ich die Aufgabe richtig verstehe gibt der Anwender eine beliebige Zahl ein und soll dann die Buchstaben ausgespuckt bekommen.

Gruß KlaDi.


----------



## deepthroat (25. April 2007)

Hi.





KlaDi hat gesagt.:


> Hallo,
> 
> also ich verstehe nicht, warum man dafür ne 6 bekommen sollte? Nur weil A = 0 ist? Davon bekommt der Anwender doch eh nichts mit und ein Array beginnt nunmal mit dem Index 0 in über 50% der Programmiersprachen.


Das hat doch mit dem Array nichts zu tun (zumal gar kein Array verwendet wurde). Auch habe ich nicht bemängelt das A = 0 ist - das kann man ja so machen (obwohl A eigentlich 1 sein sollte - was der Anwender sehr wohl bemerken wird). Nur wenn man 0 eingibt kommt ein Leerstring raus - das Ergebnis sollte dann aber "A" sein. Außerdem sollte dann AA = 26 sein - der String AA wird aber durch den Code von Matthias nie generiert.


KlaDi hat gesagt.:


> Wenn ich die Aufgabe richtig verstehe gibt der Anwender eine beliebige Zahl ein und soll dann die Buchstaben ausgespuckt bekommen.


Ich glaube du hast die Aufgabe nicht richtig verstanden. Der Anwender soll eine beliebige Zahl eingeben, und dann ein bestimmtes Ergebnis ausgegeben bekommen - nicht irgendeine Ansammlung von Buchstaben, sondern so wie die Aufgabe es fordert. In einem Schulaufsatz muß man auch nur Text der deutschen Sprache in grammatikalisch, orthografisch richtiger Form schreiben - wenn aber das Thema verfehlt ist, bekommt man dafür keine gute Note.

Gruß


----------



## DarthShader (25. April 2007)

Danke deepthroat, Du drückst aus was ich beim lesen der meisten Antworten hier denke 

Also nochmal, es geht nicht um irgendein Array, oder dass ein Array normal mit 0 beginnt (was mir durchaus bewusst ist). Ich brauche eine Abbildung von 1 auf A, 2 auf B, Z auf 26, *AA auf 27* .

Denn AA = A*26^1 + A*26^0  =  26 + 1 = 27

@Matthias Reitinger: könntest Du Dir irgendwie eine Abänderung Deines Codes vorstellen, damit mein Problem richtig gelöst wird?

@deepthroat: Ich habe auch in den anderen Thread geschaut, den Du vorgeschlagen hast. Den C++ code, den Du als letztes gepostet hattest, funktioniert der so, dass es mein Problem löst? Meinst Du ich könnte den quasi 1 zu 1 nach Java portieren?


----------



## deepthroat (25. April 2007)

DarthShader hat gesagt.:


> @deepthroat: Ich habe auch in den anderen Thread geschaut, den Du vorgeschlagen hast. Den C++ code, den Du als letztes gepostet hattest, funktioniert der so, dass es mein Problem löst?


Ja, allerdings gehe ich dort auch davon aus das A = 0 ist. Das läßt sich allerdings recht einfach lösen: Du mußt nur die Inkrementierung des Parameters "value" weglassen.


DarthShader hat gesagt.:


> Meinst Du ich könnte den quasi 1 zu 1 nach Java portieren?


Ganz bestimmt.

Gruß


----------



## Flo<H> (25. April 2007)

Hallo!
Hier mal ein kleiner Vorschlag von mir:

```
public String intToString(int number)
	{
		StringBuffer sb = new StringBuffer();
		
		while(number > 26)
		{
			sb.append("A");
			number -= 26;
		}
		
		sb.append(chars[number-1]);
		
		return sb.toString();
	}
	
	private String[] chars = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
```


```
intToString(1) = A
intToString(26) = Z
intToString(27) = AA
intToString(28) = AB
```

mfg flo


----------



## DarthShader (25. April 2007)

FloH hat gesagt.:
			
		

> Hallo!
> Hier mal ein kleiner Vorschlag von mir:
> ...
> mfg flo



Leider ist bei Deinem Ansatz 53 = AAA 

Das Problem kam mir zunächst so trivial vor, ist es wohl aber nicht.


----------



## Matthias Reitinger (25. April 2007)

deepthroat hat gesagt.:


> Früher in der Schule gab's für sowas eine 6 - mit dem Hinweis die Aufgabe richtig zu lesen. ;-)


Früher in der Schule hätte ich in dem Fall eine Nichtwertung der Aufgabe wegen widersprüchlicher Aufgabenstellung beantragt ;-) Mit der Konvertierung in ein Stellenwertsystem anderer Basis hat der beschriebene Algorithmus nämlich nichts zu tun.

Man muss aber trotzdem nicht viel abändern, um das gewünschte Verhalten zu erzielen:

```
public String intToString(int num) {
	final char[] letters = {
		'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
		'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
		'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
	};
	final int c = letters.length;
	
	StringBuilder sb = new StringBuilder();
	while (num > 0) {
		num--;
		sb.append(letters[num % c]);
		num /= c;
	}
	
	return sb.reverse().toString();
}
```

Grüße,
Matthias


----------



## Niederbobi (25. April 2007)

Ich probiers auch mal ...


```
public String numToAlp(long num)
  {
    String retVal = "";
    if(num > 26)
      retVal = numToAlp((int)(num / 26));
    retVal = retVal + (char)(((num - 1) % 26) + 65);

    return retVal;
   }
```

ergibt:

     System.out.println( test.numToAlp(1) ); -> A
     System.out.println( test.numToAlp(26) ); -> Z
     System.out.println( test.numToAlp(27) ); -> AA
     System.out.println( test.numToAlp(53) ); -> BA

Was bekomme ich für eine Note

Dirk

@Matthias - ich hatte meinen Code aus einem Excel VBA modul entnommen - da gibts keine StringBuffer ... - für java würde ich eher deinen Code nehmen, der ist bissel schicker  ..


----------



## deepthroat (25. April 2007)

Matthias Reitinger hat gesagt.:


> Früher in der Schule hätte ich in dem Fall eine Nichtwertung der Aufgabe wegen widersprüchlicher Aufgabenstellung beantragt ;-)


Ok, genehmigt (*grummel*) 



Matthias Reitinger hat gesagt.:


> Man muss aber trotzdem nicht viel abändern, um das gewünschte Verhalten zu erzielen: ...


Ja, das ist mal eine sehr schöne Lösung.



			
				Niederbobi hat gesagt.:
			
		

> Was bekomme ich für eine Note


Also eigentlich eine 1, aber angesichts der Lösung von Matthias nur eine 2+ ;-)

Gruß


----------

